题意(连接: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 << " ";
}
}