codeforces-1395D Boboniu Chats with Du【前缀和】【枚举】
题目
codeforces-1395D
题意
给出n个数的数组a,从1开始遍历数组
当a[i]<=m时,直接拿走a[i],
当a[i]>m时,拿走a[i],i后面的d个数不能拿,即a[i+1],a[i+2]…a[i+d]不能拿走;
重新排列数组,使得拿走的数总和最大
题解
先把>m和<=m的数分开来,最大的数肯定放在最后面(因为后面没有数了,不会对其他数造成影响),然后计算最多可以拿多少个>m的,即k = min(big_cnt,(n-1)/(d+1)),枚举取>m的数的数量,通过前缀和求总和,更新答案;
例如,>m的数取2个,d=2时;
取>m最大的3个数的和(包括放在数组最后一个的数),那么有2*2=4个数不能选,我们要先减>m的数中没取的,剩余的数再从<=m的数中最小的减去;
代码
/** @author: arc* @date: 2020-08-13 23:11:13*/
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll,LL;
const int maxn = 1e5+5;ll a[maxn], big[maxn], little[maxn];
ll big_sum[maxn], little_sum[maxn];bool cmp(ll a, ll b) { return a > b; }int main(){int n, d;ll m;int big_cnt = 0;int little_cnt = 0;scanf("%d%d%lld", &n, &d, &m);for (int i = 1; i <= n; i++) {scanf("%lld", &a[i]);if (a[i] > m) {big[++big_cnt] = a[i];} else {little[++little_cnt] = a[i];}}sort(big + 1, big + 1 + big_cnt, cmp);sort(little + 1, little + 1 + little_cnt, cmp);big_sum[0] = 0;big_sum[1] = 0;for (int i = 1; i <= big_cnt; i++) {big_sum[i] = big_sum[i - 1] + big[i];}little_sum[0] = 0;for (int i = 1; i <= little_cnt; i++) {little_sum[i] = little_sum[i - 1] + little[i];}int k = (n - 1) / (d + 1);k = min(k, big_cnt);ll ans = 0;for (int i = 0; i <= k; i++) {int big_remove = max(0, i * d - max(0, (big_cnt - 1 - i)));int pos = little_cnt - big_remove;int pos2 = min(big_cnt, i + 1);ans = max(ans, little_sum[pos] + big_sum[pos2]);}printf("%lld\n", ans);return 0;
}
codeforces-1395D Boboniu Chats with Du【前缀和】【枚举】相关推荐
- CodeForces - 1395D - Boboniu Chats with Du 贪心
CodeForces - 1395D - Boboniu Chats with Du 贪心 题意:如果ai>ma_i>mai>m,并且当天可以说话,则接下来ddd天不能说话.其余所 ...
- CodeForces - 1395D Boboniu Chats with Du(贪心)
题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,现在可以对数列 a 进行重新排序,规定: 如果 a[ i ] > m 的话,那么接下来 d 天的数字不做贡献 否则没有影响 问如何排 ...
- codeforces 1395D Boboniu Chats with Du(DP、思维)
题目 题意:给出三个数:n,d,m,然后给出一个长度为n的数组,你需要做的是将这个数组重新定义一个顺序使得所有可以加在一起的数字的和最大(当数组里面的一个数大于m,接下来的d个数字不能加进来) AC代 ...
- [思维] CF 1395D Boboniu Chats with Du
题目 题目链接:https://codeforces.ml/contest/1395/problem/D 思路 分两个数组存,一个存>m的一个存<=m的. 枚举选i个>m的 那么就有 ...
- codeforces D. Boboniu Chats with Du
题目 题意: 给你一个aaa序列,对于每一个aia_iai,如果此时的ai>ma_i>mai>m,那么接下去的ddd个aia_iai将无效,在可以将aaa序列重新排列的情况下, ...
- Codeforces 1395 D. Boboniu Chats with Du(贪心枚举答案)
传送门 题意: 思路: 先把大于m的放在b数组,小于m的放在a数组 枚举一下最终结果中用了几个b,取一个最大值即可 看代码应该能明白(有注释) 代码: int a[MAXN],b[MAXN]; ll ...
- Boboniu Chats with Du(贪心 + 前缀和)
题目链接: Boboniu Chats with Du 大致题意: 给你n个数字, 让你给这n个数字进行合理排序, 使得结果这n个数字之和最大. 条件: 如果某个位置i出现了大于m的数字, 则接下来的 ...
- D. Boboniu Chats with Du (664 div2 贪心 枚举)
D. Boboniu Chats with Du 题意: 给 n 个快乐值,你可以按任何顺序在群里说出快乐值为 kik_iki 的话,当 m<kim<k_im<ki 时,你会获得 ...
- A. Boboniu Chats with Du
A. Boboniu Chats with Du 解题思路:先将>m的和<=m的分别统计一下,然后再来枚举>m的,每次的枚举的a个都必须有一个放在最后,对于剩下的a-1个,应该消耗( ...
- Codeforces1395 D. Boboniu Chats with Du(贪心)
Have you ever used the chat application QQ? Well, in a chat group of QQ, administrators can muzzle a ...
最新文章
- Java Swing控件样式设置
- 【转】性能监控 -- 应用服务器常见监控指标
- 交换机生成树协议配置
- Android开发工具之Android Studio--如何打包sdk通过arr包的方式
- OpenCV相机使用的实例(附完整代码)
- STL之Map完整(Linux内核)内部实现
- 熬夜写代码,不如换女装入 GitHub 获上千 Star?
- 网络集成方案_用户需要的综合性解决方案:网络安全架构集成的价值凸显
- mysql 触发器和存储过程组合使用,实现定时触发操作
- RedHat 7配置KVM和桥接
- R语言数据科学编程教程-从新手到大师
- STM8S103FP6芯片PB_4/PB_5输出问题
- 微信小程序安装Vant组件库
- c语言 牛顿方法计算平方根,sqrt()平方根计算函数的实现2——牛顿迭代法
- 新媒体运营是什么专业
- xx学院学员评优评奖管理系统
- FW: 10家不错的iphone编程资源站
- java的发展(8-17新特性整理)
- Android ART dex2oat 加载加速浅析
- 游综宅2021最新天下布魔下载渠道 Tenkafu MA下载官网地址