A2. Toy Train

mac2026-06-22  0

题意(连接:http://codeforces.com/contest/1129/problem/A2)

就是小火车在环形铁路上开,遇到车站每次都可以装卸糖果,以某个车站为起点,问把每一个糖果都卸到指定车站的最短时间,输出所有可能性结果

分析

对于一个车站,有x个糖果,至少要经过这个车站x次,因为每次都只能装一颗,那就意味着至少要跑x-1圈,那么在一圈中肯定已经经过了要卸货的车站,因为一圈嘛,所有的车站都经过了一遍,所以对于一个车站,再次经过该车站的时候之前从该车站装上的货物肯定卸了,所以对于x-1圈来说,该车站的x-1颗糖果已经卸完了,一个车站的糖果全部卸完就需要(x-1)*n+最后一颗糖果需要的时间,那么如果不是以该车站为火车开始的起点的话,还要加上从起点到该车站的时间,只要双重遍历就可以,1.以某个车站为起点,2.所有车站的时间,取最大值,就可以算出以所有车站为起点所需的时间啦

代码

#include <stdio.h> #include <vector> #include <string> #include <iostream> #include <sstream> #include <map> #include <algorithm> using namespace std; #define ll long long int cnt[5005]; int main(void) { int n, m; cin >> n >> m; int nearest[5005]; for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; b = b > a ? b : b + n; if (!cnt[a] || b < nearest[a]) nearest[a] = b; cnt[a]++; } for (int i = 1; i <= n; ++i) {//每一个车站为起点 int time=0; for (int j = 1; j <= n; ++j) {//每一个车站的最小时间 if (!cnt[j]) continue; int x = (cnt[j]-1) * n + (nearest[j]+(i>j?n: 0));//前n-1圈的时间加上最后一圈的时间 time = max(x, time); } cout << time-i << " "; } }
最新回复(0)