【题解】CF1394A

题目链接

解题思路

我们将 $>m$ 和 $<=m$ 的数字归为两组a,b,两组可独立考虑。对于每一组中,都取最大的几个。
如果我们取了 $i$ 个b,则b只能取 $(n-i-1)/(d+1)+1$ 个。穷举i即可在 $O(nlogn)$ 的时间内得到答案。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,d,m;
int a[100005];
int cnt=0;
int ans=0;
int suma[100005],sumb[100005];
int aa[100005],bb[100005];
bool cmp(int aa,int bb){
    return aa>bb;
}
int cnta,cntb;
signed main(){
    cin>>n>>d>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(a[i]>m)aa[++cnta]=a[i];
        else bb[++cntb]=a[i];
    }
    sort(aa+1,aa+cnta+1,cmp);
    sort(bb+1,bb+cntb+1,cmp);
    int tot=0;
    for(int i=1;i<=cnta;i++)suma[i]=suma[i-1]+aa[i];
    for(int i=1;i<=cntb;i++)sumb[i]=sumb[i-1]+bb[i];
    for(int i=0;i<=n;i++){
        tot=sumb[i]+suma[(n-i-1)/(d+1)+1];
        ans=max(ans,tot);
    }
    cout<<ans<<endl;
    return 0;
}

PS:每次cf都想不到枚举(哭

本文链接:http://kaispace.com.cn/index.php/archives/687/

如果未注明出处,复制公开后需将注明本博客链接。
打赏作者