Codeforces Round #542 D、Toy Train
题目链接
题目大意:
有n个火车站,成环状分布,即火车到n车站后驶回1车站,火车只能顺时针单向行驶,且每从一个车站到下一个车站耗时1秒。当前有m个糖果分别分布在n个车站上,你需要通过火车将m个糖果分别运送到各自的目的地。火车每次只能从车站上选取一颗糖果装上车,但可以将任意颗糖果卸下到站。请分别输出从1.。。。n号火车站出发,火车将每颗糖果运送到目的地的最小时间。
思维:
我们可以这样考虑,由于火车行驶的方向是固定的,设某车站需要运输的糖果为n颗,
则火车必须跑至少n轮,且在第n次到达车站时,必定已将n-1颗糖果运送到指定车站,则只需要将最后一枚糖果运送到站即可。为保证路线最短,则可以维护一个数组为该点运送糖果到站最近距离。
那么设出发车站为s,第n到达i车站所需时间为dist(s,i)+n∗(candies(i)−1)最后再加上dist(i,e)即为所需总时间。
从一个点出发,将任意站点糖果送全部达出所耗时间最大值,即为将所有站点糖果送出的最小耗时;
那么代码实现也很简单:
#include <iostream>
#include <algorithm>
using namespace std;
const int inf = 1e9;
int candies[5100], finaldis[51000];
int main()
{
int n, m, u, v;
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
cin >> u >> v;
candies[u]++;
finaldis[u] = (finaldis[u] == 0 ? (v + n - u) % n :
min(finaldis[u], (v + n - u) % n));
}
for (int i = 1; i <= n; i++)
{
int ans = 0, now;
for (int j = 0; j < n; j++)
{
now = (i + j > n ? i + j - n : i + j);
ans = max(ans, j + (candies[now] - 1)*n + finaldis[now]);
}
cout << ans << ' ';
}
}