C. RationalLee 思维题

Posted qq2210446939

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于C. RationalLee 思维题的主要内容,如果未能解决你的问题,请参考以下文章

C. Meaningless Operations Codeforces Global Round 1 异或与运算,思维题

Educational Codeforces Round 84 (Rated for Div. 2) C. Game with Chips(思维题)

Codeforces Round #587 C. White Sheet(思维+计算几何)

Codeforces Round #556 (Div. 2) - C. Prefix Sum Primes(思维)

CF C. Three displays(DP+思维)

[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段