题目链接:http://codeforces.com/contest/1130/problem/D2
题目大意:
有一个编号1~n的环,有些糖果位于一些点上要到达另一个点,问以每个点作为出发点,最后所需花的最小时间是多少。
题目思路:
对于单个点 j ,我假设除了他的其他点没有糖果,那么从另一个点 i 出发,我想要运完j的所有的糖果,我先要让 i 走到 j ,然后假设j有m个物品,我一定要走m-1圈最后一个物品我尽量的少走就可以了,所以我先预处理出每个点的所有物品,算出哪个做最后一次走的步数最小,我只要对于一个出发点,枚举全部的有糖果的点,取max就是最后的答案。
代码:
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<cmath>
#include<vector>
#define ll long long
using namespace std;
const int MAXN=1e5+5;
vector<int>v[MAXN];
int litter[MAXN];
int n;
int dis(int x,int y)
{
if(x<=y)return y-x;
else return n-(x-y);
}
int main()
{
int m;
cin>>n>>m;
for(int i=1;i<=n;i++){
litter[i]=n-1;
}
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
v[a].push_back(b);
//v[b].push_back(a);
}
for(int i=1;i<=n;i++){
int len=v[i].size();
for(int j=0;j<len;j++){
litter[i]=min(litter[i],dis(i,v[i][j]));
}
}
for(int i=1;i<=n;i++){
int ans=-1;
for(int j=1;j<=n;j++){
int now=v[j].size()-1;
if(v[j].size())ans=max(ans,dis(i,j)+now*n+litter[j]);
}
cout<<ans<<" ";
}
cout<<endl;
}