codeforces 1129A2-Toy Train

传送门:QAQQAQ

题意:有1-n个站点,成环形,有一辆运货车,在这个n个站点之间运输糖果,货车只能按照1->n的方向走,到第n个站的时候,又回到的1,现在告诉你有m个运输任务,从x站点运输一个糖果到y站点。已知货车的容量足够大,可以同时装无数个糖果,但是每一次经过一个站的时候,只能够选择其中一项任务进行运输,假设从一个站到另一个站的运输时间为1,请问从1-n每个站点作为起点,最短的运输时间分别是多少

假设从第i个点出发要运输K个糖果,那么就要经过点iK次。所以预处理出运输完这些糖果最后停下的最近点,就是满足i点的最近距离,对所有最近距离取MAX,就是最终答案
用t表示糖果数,p表示最近点
(t[j]=0要判掉,因为根本不用考虑从i走到j,而且在代码中t[j]=0时p[j]=n,所以会把n*(t[j]-1)抵掉)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int n,m,r=0;
 5 vector<int> v[6050];
 6 int p[6050],t[6050];
 7 
 8 int calc(int s,int e)
 9 {
10     int ret=e-s;
11     if (ret<0) ret+=n;
12     return ret;
13 }
14 
15 int main()
16 {
17     memset(t,0,sizeof(t));
18     scanf("%d%d",&n,&m);
19     for(int i=1;i<=m;i++)
20     {
21         int x,y;
22         scanf("%d%d",&x,&y);
23         v[x].push_back(y);
24         t[x]++;
25     }
26     for(int i=1;i<=n;i++)
27     {
28         int minn=n;
29         for(int j=0;j<(int)v[i].size();j++)
30         {
31             minn=min(minn,calc(i,v[i][j]));
32         }
33         p[i]=minn;
34     }
35     for(int i=1;i<=n;i++)
36     {
37         int ans=0;
38         for(int j=1;j<=n;j++)
39         {
40             if(t[j]==0) continue;
41             ans=max(ans,calc(i,j)+n*(t[j]-1)+p[j]);
42         }
43         printf("%d ",ans);
44     }
45     return 0;
46 }
原文地址:https://www.cnblogs.com/Forever-666/p/10531429.html