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(思维)
[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段