Toy Train(贪心)

时间:2023-02-12 22:51:59

题目链接:http://codeforces.com/contest/1130/problem/D1

题目大意:给你n个点,然后m条运输任务,然后问你从每个点作为起点是,完成这些运输任务的最小花费?每一次运输必须是1,2,3按照这个方向来进行的,当到达n的时候,会直接到达1,这是一个圆形回路。

具体思路:枚举每一个点,对于每一个点,判断一下从这个点开始运送完的花费,然后从这个花费里面找到一个花费最大的就可以了,这样就能保证其余的任务也都能完成。

AC代码:

 #include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 5e3+;
ll a[maxn];
ll len[maxn];
ll in[maxn];
int main(){
int n,m;
scanf("%d %d",&n,&m);
int st,ed;
memset(len,inf,sizeof(len));
for(int i=;i<=m;i++){
scanf("%d %d",&st,&ed);
in[st]++;
ll tmp=ed-st>?ed-st:n-st+ed;//注意行驶轨迹是圆形的
len[st]=min(len[st],tmp);
}
for(int i=;i<=n;i++){
if(!in[i])len[i]=;
}
for(int i=;i<=n;i++){
ll ans=;
for(int j=;j<=n;j++){
ll tmp=(j-i>=?j-i:n-i+j);
tmp+=(in[j]-1ll)*n+len[j];
ans=max(ans,tmp);
}
if(i==)printf("%lld",ans);
else printf(" %lld",ans);
}
printf("\n");
}