传送门: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 }