用dis[]来保存这样的数据:从车站i出发,最少需要多少距离能够把在i的糖果全部运完。这个距离,其实只需要知道找到最后送哪一个糖果即可,之前的糖果都是用“跑一整圈”的方式送到的。
最后的答案,只需要假定从s号车站出发,然后遍历每一个车站,找到这样一个车站i,从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;
}