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("
");
34 }
原文地址:https://www.cnblogs.com/letlifestop/p/10452248.html