1. 程式人生 > 實用技巧 >2020 CCPC - 網路賽 6890 Express Mail Taking(思維)

2020 CCPC - 網路賽 6890 Express Mail Taking(思維)

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