Codeforces Round #321 (Div. 2) 580B Kefa and Company(贪心 + 二分)
2015-09-24 09:25
423 查看
题目链接:点击打开链接
第一行给出n、d,接下来n行每行两个数,代表一个人的财富程度与友好值,让你从里面选人使得友好值之和最大且任意两人财富值差值小于d。
当时wa了好多发,比赛快结束时一个陌生紫名发来他的代码2333
我爆int以及思路有问题
首先按照钱数从小到大排序n个结构体,b数组存储排序后前x个人的友好总值(x >= 1 && x <= n),而后遍历每个人,二分查找出满足钱
数差小于d的友好值最大的人,用刚刚的b数组即可减去当前人的友好值总和即可得出答案。
AC代码:
第一行给出n、d,接下来n行每行两个数,代表一个人的财富程度与友好值,让你从里面选人使得友好值之和最大且任意两人财富值差值小于d。
当时wa了好多发,比赛快结束时一个陌生紫名发来他的代码2333
我爆int以及思路有问题
首先按照钱数从小到大排序n个结构体,b数组存储排序后前x个人的友好总值(x >= 1 && x <= n),而后遍历每个人,二分查找出满足钱
数差小于d的友好值最大的人,用刚刚的b数组即可减去当前人的友好值总和即可得出答案。
AC代码:
#include "iostream" #include "cstdio" #include "cstring" #include "algorithm" using namespace std; const int MAXN = 1e5+5; typedef long long ll; ll n, d, ans, b[MAXN]; struct node { /* data */ ll mon, fri; }a[MAXN]; bool cmp(node a, node b) { return a.mon < b.mon; } int main(int argc, char const *argv[]) { cin >> n >> d; for(int i = 0; i < n; ++i) cin >> a[i].mon >> a[i].fri; sort(a, a + n, cmp); for(int i = 1; i <= n; ++i) b[i] = a[i - 1].fri + b[i - 1]; for(int i = 0; i < n; ++i) { int l = i, r = n; while(r - 1 > l) { int mid = (l + r) >> 1; if(a[mid].mon - a[i].mon < d) l = mid; else r = mid; } ans = max(ans, b[l + 1] - b[i]); } cout << ans << endl; return 0; }
相关文章推荐
- 同样思路解决不同的问题,集大成者
- 【转】一个FAE(AE)的体会和大家交流
- sqlserver 开窗函数分页
- 前端事件系统(一)
- jQuery实现的经典竖向伸缩菜单效果代码
- 自定义控件 仿应用宝 管理界面的标题栏缩放效果
- hdu 4788 Hard Disk Drive
- 魅族的品牌策略
- VirtualBox虚拟机网络设置(四种方式)
- codeforces#321 B(排序+二分)
- Resharper 8.2 注册码
- 源码编译搭建LAMP
- iOS开发笔记--iOS 学习资料整理
- JS重新加载当前页面
- python入门2
- 深入浅出解析正则表达式-替换原则
- 解决Apache/PHP无法启动的问题
- 亿级Web系统搭建:单机到分布式集群
- 一个爬树的老程序猿
- *Search for a range