CodeForces - 1394A - Boboniu Chats with Du (贪心 + 枚举)

Boboniu Chats with Du

题意

n n n 个快乐因子有两种, 一种大于 m m m ,一种小于等于 m m m ,某一天选了第一种时 ,接下来的 d d d 天(不包括选的这一天) 都会被禁言,不能累加别的快乐因子。若选择了第二种则没有影响 ,问怎样选择才能使 n n n 天的快乐因子和最大

思路

枚举选多少个第一种快乐因子即可 首先若选第一种快乐因子肯定选大的,因为选了后同样都是禁言 d d d 天,第二种快乐因子也类似 能选就选大的,所以先将两种按降序排序,然后枚举选多少次第一种快乐因子,将 r e s res res 赋初值为 s u m 1 [ n ] sum1[n] sum1[n] 所以可以不用枚举等于 0 0 0 的情况

还需要注意的是,若将大于 m m m 的快乐因子放在最后一天,只会被禁言一天,所以每次枚举都将其中一个放在最后一天

代码

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 998244353
#define endl '\n'
using namespace std;
typedef long long LL;
const int N = 100100;

LL n, d, m;
LL a[N], b[N];
LL sum1[N], sum2[N];

bool cmp(int a, int b) {
    return a > b;
}


void solve() {
    cin >> n >> d >> m;
    LL  cnt1 = 0, cnt2 = 0;
    for (LL i = 1; i <= n; ++i) {
        LL x; cin >> x;
        if (x <= m)a[++cnt1] = x;
        else b[++cnt2] = x;
    }

    sort(a + 1, a + cnt1 + 1, cmp);
    sort(b + 1, b + cnt2 + 1, cmp);

    for (LL i = 1; i <= n; ++i)
        sum1[i] = sum1[i - 1] + a[i];
    for (LL i = 1; i <= cnt2; ++i) {
        sum2[i] = sum2[i - 1] + b[i];
    }

    LL res = sum1[n];
    for (LL i = 1; i <= cnt2; ++i) { //枚举选几个 大于 m 的
        LL sum = sum2[i];

        LL rem = (i - 1) * (d + 1) + 1;
        if (rem > n)break;

        rem = n - rem;
        res = max(res, sum + sum1[rem]);
    }

    cout << res << endl;
}
int main(){
    //int t; cin >> t;
    //while(t--)
        solve();
    
    return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzqwtc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值