D. Boboniu Chats with Du(暴力枚举)

我吐了

这D题真的很水,难度和A题差不多(真的不夸张,很多人只是没看题把)

你要是没做出来,真的很不应该

, m , , d 把快乐因子分成两种,一种是大于m的,选了后,肯定闭嘴d天

m , , 一种是小于等于m的,选了后,没事哦 ~

m ? 那我们直接枚举选几个快乐因子大于m的不就行了吗?

x m , x , 比如选x个快乐因子大于m的,那我肯定拿x个快乐因子最大的,反正都是闭嘴

n , , 1 其中有一个快乐因子在第n天放,这样这次就不用闭嘴了,只需要消耗1天

( x 1 ) ( d + 1 ) + 1 所以此时消耗了(x-1)*(d+1)+1

, m , 剩下的几天,都选快乐因子小于等于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;
} 

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/107971664