2014 Super Training #6 H Edward's Cola Plan --排序+二分
2014-07-11 20:07
211 查看
原题: ZOJ 3676 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3676
题意:给每个朋友一瓶可乐,可乐有普通和高级两种,每个朋友只能喝一瓶可乐,喝普通可乐的朋友会给你P个瓶盖,喝高级可乐的朋友会给你Q个瓶盖。问最多能得到多少个瓶盖。瓶盖可以借。
解法:因为瓶盖可以借任意多个,所以按Q-P排序即可,二分临界点Q-P=0的点,即Q-P<m的让他和普通可乐,Q-P>m的喝高级可乐,Q-P=m的无所谓喝什么。
代码:
View Code
题意:给每个朋友一瓶可乐,可乐有普通和高级两种,每个朋友只能喝一瓶可乐,喝普通可乐的朋友会给你P个瓶盖,喝高级可乐的朋友会给你Q个瓶盖。问最多能得到多少个瓶盖。瓶盖可以借。
解法:因为瓶盖可以借任意多个,所以按Q-P排序即可,二分临界点Q-P=0的点,即Q-P<m的让他和普通可乐,Q-P>m的喝高级可乐,Q-P=m的无所谓喝什么。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> using namespace std; #define N 100007 struct node { int P,Q; int dif; }p ; int SP ,SQ ; int cmp(node ka,node kb) { return ka.dif < kb.dif; } int main() { int n,m,k; int i,j; while(scanf("%d%d",&n,&m)!=EOF) { SP[0] = SQ[0] = 0; for(i=1;i<=n;i++) { scanf("%d%d",&p[i].P,&p[i].Q); p[i].dif = p[i].Q-p[i].P; } sort(p+1,p+n+1,cmp); for(i=1;i<=n;i++) { SP[i] = SP[i-1]+p[i].P; SQ[i] = SQ[i-1]+p[i].Q; } for(i=0;i<m;i++) { scanf("%d",&k); int low = 1; int high = n; int res = -1; while(low <= high) { int mid = (low+high)/2; if(p[mid].dif < k) low = mid + 1; else { res = mid; high = mid - 1; } } if(res == -1) //如果全小于k,则全喝普通的 printf("%d\n",SP ); else printf("%d\n",SP[res-1]+SQ -SQ[res-1]-(n-res+1)*k); } } return 0; }
View Code
相关文章推荐
- 【ZOJ月赛】【二分查找】【A.Edward's Cola Plan】
- 【心血】算法清单 & 应用(含搜索,动态规划,排序,数据结构,最短路,二分,字符串,其他)
- 数组 获取最值(最大值 最小值)选择排序 冒泡排序 快速排序 半查找(二分查找) 十进制转其他进制法
- 快速排序和二分查找时间复杂度详解
- HDUoj 2141 Can you find it?(排序+二分)
- 题目:排序列表转换为二分查找树
- 快速排序+二分查找
- UVALive 2949 Elevator Stopping Plan(二分 + 贪心)
- 排序及二分查找
- [算法专题] 二分搜索&排序数组
- 排序方法之冒泡(鸡尾酒)、选择、插入(二分插入)、希尔排序
- 插入排序和二分插入排序
- bzoj4552: [Tjoi2016&Heoi2016]排序(二分+线段树)
- BZOJ 4552 [Tjoi2016&Heoi2016]排序 | 二分答案 线段树
- UVA10763交换生配对问题,排序加二分,或者multimap
- 数组排序后二分查找
- [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树)
- 可视化的排序五:插入排序、二分插入排序和希尔排序
- HDU 4898 The Revenge of the Princess’ Knight(后缀数组+二分+暴力)(2014 Multi-University Training Contest 4)
- C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)