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 }

 

转载于:https://www.cnblogs.com/letlifestop/p/10452248.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值