码迷,mamicode.com
首页 > 其他好文 > 详细

[ cf1935D ] D. Boboniu Chats with Du 思维

时间:2020-08-19 19:25:03      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:max   构造   占用   ++   为什么   mes   pair   out   define   

D. Boboniu Chats with Du

构造比较离谱。

我原本的思路是:要么选一个大于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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!