zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    bzoj 1004 burnside 引理+DP
    bzoj 3453 数论
    HDU 2899 三分
    HDU 2199 二分
    bzoj 3450 DP
    bzoj 1197 DP
    bzoj 2121 DP
    bzoj 2258 splay
    bzoj 1296 DP
    Memcached的限制和使用建议
  • 原文地址:https://www.cnblogs.com/liyexin/p/13720549.html
Copyright © 2011-2022 走看看