1 条题解

  • 1
    @ 2023-5-26 15:34:28
    • 枚举每一个出发点,因为要求最短路径,答案的出发点肯定在给定的n个数中,先排序。防止数组越界,特殊处理第一个点和最后一个点。
    1. 假设第一个点是出发点: 那么总路程就是从这一个点到最大值的点的路程(ans=a[n]-a[i];)
    2. 假设最后一个点是出发点: 总路程就是走到题目所给的最大值在循环到第二大的值(ans=m-a[i]+a[i-1];);
    3. 如果枚举的出发点大于1小于n: 路程就是从这一点到数组中最大值的点在循环到枚举的这一个点的前一个点(ans=a[n]-a[i]+(a[i-1])+m-a[n];) 储存所有的答案在取min,即最优解。
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=2e5+10;
    int a[N];
    ll sum[N];
    ll cnt[N];
    int main() {
    	std::ios::sync_with_stdio(false);
    	cin.tie(0);
    	cout.tie(0);
    	int m;
    	int n;
    	cin>>m>>n;
    	for(int i=1; i<=n; i++) {
    		cin>>a[i];
    	}
    	sort(a+1,a+1+n);
    	for(int i=1; i<=n; i++) {
    		sum[i]=sum[i-1]+a[i];
    	}
    	int t=1;
    	ll ans=0;
    	for(int i=1; i<=n; i++) {
    		if(i==1)
    			ans=a[n]-a[i];
    		else if(i>1&&i<n)
    			ans=a[n]-a[i]+(a[i-1])+m-a[n];
    		else if(i==n)
    			ans=m-a[i]+a[i-1];
    		cnt[t]=ans;
    		t++;
    	}
    	sort(cnt+1,cnt+t);
    	cout<<cnt[1]<<endl;
    }
    
    • 1

    信息

    ID
    808
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    857
    已通过
    73
    上传者