我吐了
这D题真的很水,难度和A题差不多(真的不夸张,很多人只是没看题把)
你要是没做出来,真的很不应该
把快乐因子分成两种,一种是大于m的,选了后,肯定闭嘴d天
一种是小于等于m的,选了后,没事哦~
那我们直接枚举选几个快乐因子大于m的不就行了吗?
比如选x个快乐因子大于m的,那我肯定拿x个快乐因子最大的,反正都是闭嘴
其中有一个快乐因子在第n天放,这样这次就不用闭嘴了,只需要消耗1天
所以此时消耗了(x−1)∗(d+1)+1
剩下的几天,都选快乐因子小于等于m的且最大的,反正不用闭嘴了嘛
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[100009],b[100009],pre[100009];
int top1,top2,n,d,m;
bool com(int q,int w){
return q>w;
}
signed main()
{
cin >> n >> d >> m;
for(int i=1;i<=n;i++)
{
int x; scanf("%lld",&x);
if( x<=m ) a[++top1]=x;//不被禁言的
else b[++top2]=x;//要被禁言的
}
sort(a+1,a+1+top1,com);
sort(b+1,b+1+top2,com);
for(int i=1;i<=n;i++) pre[i]=pre[i-1]+a[i];
int sumn=0,ans=pre[n];
for(int j=1;j<=top2;j++)//被禁言几次
{
sumn+=b[j];
int yu=(j-1)*(d+1)+1;
if( yu>n ) break;
yu=n-yu;
ans=max(ans,sumn+pre[yu] );
}
cout << ans;
}