标签:max 构造 占用 ++ 为什么 mes pair out define
构造比较离谱。
我原本的思路是:要么选一个大于m的,占用d+1天;要么选d+1个小于等于m的。然后嗯贪。
贪个p,样例都过不了——因为没考虑一点,让一个大于m的去占据最后一个位置一定最优。
假设让他占之前的位置,那么原本可以放小于m的数的位置就减少了。
所以选择大于m的A类数 x 个,占用天数为\((x-1)\ast(d+1) + 1\).
则小于m的B类数能够占用的天数为 n 减去上面那么多。
直接计算B类数从1~n的前缀和(为什么不是从1~posb?,因为可能后面遍历的时候选A类+B类的数不够n个!)。然后1~posa遍历,取1, 2, ...... , posa 个 A类数,计算剩余位置,再放满B类数,更新最大答案。
当然也要注意,我们也有可能不选A类数(比如没有A类数,这是个特殊情况),所以初始化答案的时候直接等于B类数之和即可。
#include<bits/stdc++.h>
#define ll long long
#define pll pair<ll,ll>
#define pii pair<int,int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define mem0(x) memset(x,0,sizeof(x))
#define meminf(x) memset(x,0x3f,sizeof(x))
#define VI vector<int>
#define VL vector<ll>
using namespace std;
const int N = 1e5+5;
ll a[N],b[N];
int posa = 0,posb=0, cntb = 0 ;
int main(){
ios::sync_with_stdio(0);
int n,d,m;cin>>n>>d>>m;
rep(i,1,n){
ll tmp;cin>>tmp;
if(tmp>m){
a[++posa] = tmp;
}else{
b[++posb] = tmp;
}
}
sort(a+1,a+1+posa,greater<ll>());
sort(b+1,b+1+posb,greater<ll>());
rep(i,1,n){
b[i] += b[i-1];
}
ll sum = 0, ans = b[posb];
rep(i,1,posa){
sum+= a[i];
ll sub = (ll)(i-1)*(d+1) + 1;
if(sub>n) break;
ans = max(ans,b[(ll)n-sub]+sum);
}
cout<<ans;
}
[ cf1935D ] D. Boboniu Chats with Du 思维
标签:max 构造 占用 ++ 为什么 mes pair out define
原文地址:https://www.cnblogs.com/Cha2azzZ/p/13515270.html