CF1129A2 Toy Train

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;
	}
}

猜你喜欢

转载自www.cnblogs.com/fxh0707/p/12307032.html