DIS []は、このデータを格納すると:駅から私は、私はすべての輸送が終了置くことができるお菓子の数の最小値が必要です。この距離は、実際には、単にどこキャンディが「フルサークルを実行する」方法である前に、最後に送られたことができお菓子を見つけるために知っておく必要があります。
最終的な答えは、まさにそれが、その後、各ステーションを通じて、私にSから、このようなステーションIを、見つけるために、駅から数だと仮定し、プラスの株式を実行しなければならないがDIS [i]が、これはすべてのお菓子最大です距離。
#include<bits/stdc++.h>
using namespace std;
struct node {int x,y;};
vector<int> s[101];//每个车站的糖果情况
int n,m;
int Min(vector<int> v,int s)//车站s中可以运送掉一个货物的最短距离
{
int m=0x3f3f3f3f;
for(int i=0;i<v.size();i++){
if(v[i]>s){
m=min(m,v[i]-s);
}
if(v[i]<=s) {
m=min(m,n-(s-v[i]));
}
}
return m;
}
int main()
{
cin>>n>>m;//m个货物
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
s[x].push_back(y);
}
//接下来记录距离
int dis[101];
memset(dis,0x3f,sizeof(dis));
//找到从每个车站出发需要的最短距离
for(int i=1;i<=n;i++)
{
if(s[i].empty()) continue;
else{
dis[i]=Min(s[i],i)+n*(s[i].size()-1);
}
}
// for(int i=1;i<=n;i++){
// cout<<dis[i]<<endl;
// }
for(int s1=1;s1<=n;s1++){
//每一个车站为起点
int m=0;
for(int i=1;i<=n;i++){
if(s[i].empty()) continue;
if(i<s1) m=max(m,dis[i]+n-(s1-i));//i在s后面,看做先跑一圈到s,再倒退回i
else m=max(m,dis[i]+i-s1);
}
cout<<m<<' ';
}
cout<<endl;
return 0;
}