• C. RationalLee 思维题


    题意

      给你n个数字,要求把它们分成k组,每组w[i]个,ans为每组的最小值加最大值的总和。

    思路

      很容易看出,如果一组只有一个人,那么把尽可能较大的分给他,最小值和最大值都会大,ans也会大,所有我们先把大的数分给那些只有一个人的组。

      考虑剩下的情况,现在每组的最大值都是确认的(较大的每组一个),那么我们需要把每组的最小值尽可能地提高,所以我们依次把一个最大值,w[cnt]-1个小值分给cnt号组,cnt从k到1,这样就能使之后的组的最小值尽可能高。

    AC代码

    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=2e5+5;
    typedef long long ll;
    int t,n,k;
    int a[maxn],w[maxn];
    ll ans;
    int main()
    {
        cin>>t;
        while(t--){
            cin>>n>>k;
            ans=0;
            for(int i=1;i<=n;i++)
                cin>>a[i];
            for(int i=1;i<=k;i++)
                cin>>w[i];
            sort(a+1,a+1+n);
            sort(w+1,w+1+k);
            int cnt=1;
            while(w[cnt]==1){
                ans+=a[n]*2;
                n--;
                cnt++;
            }
            int l=1,r=n;
            while(cnt<=k){
                ans+=a[l]+a[r];
                l+=w[k]-1;
                k--;
                r--;
            }
            cout<<ans<<'
    ';
        }
        return 0;
    }
  • 相关阅读:
    MD5双重加密设计
    ComBox(自定义封装)LimitToList属性和做到移走光标不是下拉项清空输入
    强制下线功能
    广播
    动态添加碎片
    RecyclerView
    Listview的运行效率
    Listview
    通知栏
    补间动画
  • 原文地址:https://www.cnblogs.com/qq2210446939/p/13191371.html
Copyright © 2020-2023  润新知