题意(连接: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));
time
= max(x
, time
);
}
cout
<< time
-i
<< " ";
}
}