地址: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; } }