2020 CCPC

地址:http://acm.hdu.edu.cn/showproblem.php?pid=6890

题意:

n个柜子,m个需要去拿取邮件的柜子,k号柜负责输入代码。

拿每一个ai之前,都必须去K号柜输入代码才能去拿。

拿取所有邮件,所需的最少步数。

解析:

排序

可以发现,对于第一个小于k的ai,其一定要放在最后拿,其余的顺序无所谓了。拿ai之前先去k,然后去ai,然后回k,所以每个点贡献就为abs(a[i]-k)*2。

a0<k,那么它就不需要算在贡献里面,在回去的路上顺道就可以取。

#include <bits/stdc++.h>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
vector<int>g[maxn];
ll a[maxn];
int b[maxn];
int vis[maxn];
int ok  = 0 ;
int x,y;
int main(){
    int t;
    cin>>t;
    while(t--)
    {
        ll n,m,k;
        scanf("%lld%lld%lld",&n,&m,&k);
        for(int i=1;i<=m;i++)
            scanf("%lld",&a[i]);
        ll sum=k-1;
        sort(a+1,a+1+m);
        int i=1;
        if(a[1]<k)
            i++;
        for(;i<=m;i++)
        {
            sum+=abs(a[i]-k)*2;
        }
        sum+=(k-1);
        cout<<sum<<endl;
    }
}
原文地址:https://www.cnblogs.com/liyexin/p/13720549.html