Toy Train(贪心)
题目链接:http://codeforces.com/contest/1130/problem/D1
题目大意:给你n个点,然后m条运输任务,然后问你从每个点作为起点是,完成这些运输任务的最小花费?每一次运输必须是1,2,3按照这个方向来进行的,当到达n的时候,会直接到达1,这是一个圆形回路。
具体思路:枚举每一个点,对于每一个点,判断一下从这个点开始运送完的花费,然后从这个花费里面找到一个花费最大的就可以了,这样就能保证其余的任务也都能完成。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 # define ll long long 4 # define inf 0x3f3f3f3f 5 const int maxn = 5e3+100; 6 ll a[maxn]; 7 ll len[maxn]; 8 ll in[maxn]; 9 int main(){ 10 int n,m; 11 scanf("%d %d",&n,&m); 12 int st,ed; 13 memset(len,inf,sizeof(len)); 14 for(int i=1;i<=m;i++){ 15 scanf("%d %d",&st,&ed); 16 in[st]++; 17 ll tmp=ed-st>0?ed-st:n-st+ed;//注意行驶轨迹是圆形的 18 len[st]=min(len[st],tmp); 19 } 20 for(int i=1;i<=n;i++){ 21 if(!in[i])len[i]=0; 22 } 23 for(int i=1;i<=n;i++){ 24 ll ans=0; 25 for(int j=1;j<=n;j++){ 26 ll tmp=(j-i>=0?j-i:n-i+j); 27 tmp+=(in[j]-1ll)*n+len[j]; 28 ans=max(ans,tmp); 29 } 30 if(i==1)printf("%lld",ans); 31 else printf(" %lld",ans); 32 } 33 printf("\n"); 34 }