https://codeforces.ml/problemset/problem/1129/A2
对于一个车站,有x个糖果,至少要经过这个车站x次,因为每次都只能装一颗,那就意味着至少要跑x-1圈,那么在一圈中肯定已经经过了要卸货的车站,因为一圈嘛,所有的车站都经过了一遍,所以对于一个车站,再次经过该车站的时候之前从该车站装上的货物肯定卸了,所以对于x-1圈来说,该车站的x-1颗糖果已经卸完了,一个车站的糖果全部卸完就需要(x-1)*n+最后一颗糖果需要的时间,那么如果不是以该车站为火车开始的起点的话,还要加上从起点到该车站的时间,只要双重遍历就可以,1.以某个车站为起点,2.所有车站的时间,取最大值,就可以算出以所有车站为起点所需的时间啦
#include<iostream> #include<vector> #include<cstring> using namespace std; const int N=5010; vector<int> candy[N]; int n,m; int dist[N];//每个顶点所送糖果距离的最小值 int main() { cin>>n>>m; memset(dist,0x3f,sizeof dist); while(m--) { int a,b; cin>>a>>b; candy[a].push_back(b); dist[a]=min(dist[a],(b-a+n)%n); } for(int i=1;i<=n;i++) { int res=0; int sum=0; for(int j=1;j<=n;j++) { if(!candy[j].size()) continue; sum=(j-i+n)%n+(candy[j].size()-1)*n+dist[j]; //(j-i+n)%n为当前顶点到起点的距离 //cout<<"--"<<j<<' '<<sum<<endl; res=max(res,sum);//所有顶点送完糖果的最大值为当前起点为i的状态下送完糖果的所需时间 } cout<<res<<endl; } }