cf 1129 A1

题目链接

官方题解

用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;
}

猜你喜欢

转载自blog.csdn.net/xuzonghao/article/details/88045703
a1
CF1