2017年11月4日提高组T1 背包
2017-11-08 20:04
106 查看
Description
蛤布斯有n种商品,第i种物品的价格为ai,价值为bi。有m个人来向蛤布斯购买商品,每个人每种物品只能购买一个。第j个人有cj的钱,他会不停选择一个能买得起的价格最高的商品买走(如果有多个则选择价值最高的)。你需要求出每个人购买的物品的价值和。Input
第一行两个正整数n,m。接下来n行每行两个正整数ai,bi。接下来m行每行一个正整数cj。Output
m行,每行一个整数表示答案。Hint
20%的数据,n,m<=1000。100%的数据,n,m<=100000,ai,bi,cj<=10^12。
Solution
一开始看错题目了囧,以为一件物品买完就没了排序完直接两个二分,第一个二分能买得起的最大价格,第二个二分能买多少。由于剩下的钱可能还可以继续买,所以要买到不能买为止。由于每一次至少花掉了一半的钱,所以这样会买logC次
Code
#include <stdio.h> #include <string.h> #include <math.h> #include <iostream> #include <queue> #include <vector> #include <algorithm> #define rep(i, st, ed) for (int i = st; i <= ed; i += 1) #define drp(i, st, ed) for (int i = st; i >= ed; i -= 1) #define erg(i, st) for (int i = ls[st]; i; i = e[i].next) #define fill(x, t) memset(x, t, sizeof(x)) #define min(x, y) ((x)<(y)?(x):(y)) #define max(x, y) ((x)>(y)?(x):(y)) #define ld long double #define db double #define ll long long #define INF 0x3f3f3f3f #define N 202001 #define E 1001 #define L 1001 ll a , b , rank , sumb , suma ; inline ll read() { ll x = 0, v = 1; char ch = getchar(); for (; ch < '0' || ch > '9'; v *= (ch == '-')?(-1):(1), ch = getchar()); for (; ch <= '9' && ch >= '0'; (x *= 10) += ch - '0', ch = getchar()); return x * v; } inline bool cmp(int x, int y) { return a[x] > a[y] || a[x] == a[y] && b[x] > b[y]; } int main(void) { int n = read(); int m = read(); rep(i, 1, n) { a[i] = read(); b[i] = read(); rank[i] = i; } std:: sort(rank + 1, rank + n + 1, cmp); rep(i, 1, n) { suma[i] = suma[i - 1] + a[rank[i]]; sumb[i] = sumb[i - 1] + b[rank[i]]; } rep(i, 1, m) { ll c = read(); ll ans = 0; while (c >= a[rank ]) { int l = 1; int r = n; int st = 0; while (l <= r) { int mid = (l + r) >> 1; if (a[rank[mid]] > c) { l = mid + 1; } else { st = mid; r = mid - 1; } } l = st; r = n; int ed = 0; while (l <= r) { int mid = (l + r) >> 1; if (suma[mid] - suma[st - 1] > c) { r = mid - 1; } else { ed = mid; l = mid + 1; } } ans += sumb[ed] - sumb[st - 1]; c -= suma[ed] - suma[st - 1]; if (ed == n) { break; } } printf("%lld\n",ans); // std:: cout << ans << std:: endl; } return 0; }
相关文章推荐
- SSL2834 2017年11月4日提高组T2 背包(二分)
- 洛谷P1776 宝物筛选_NOI导刊2010提高(02)(多重背包,单调队列)
- 蓝桥杯 算法提高 金明的预算方案 CODEVS 1155 【分组背包】
- 【NOIP2014提高组T3】飞扬的小鸟-完全背包
- 算法提高 金明的预算方案 有依赖的背包
- Codevs1155 金明的预算方案 ——2006年NOIP全国联赛提高组 变种经典背包dp
- JZOJ5440. 【NOIP2017提高A组冲刺11.1】背包
- 【NOIP2017提高A组模拟9.5】NYG的背包
- P1776 宝物筛选_NOI导刊2010提高(02)(背包的二进制优化)
- 2016年提高组模拟题(20161114) 物品选取 ssl 2572 dp_背包
- 【jzoj5346】【NOIP2017提高A组模拟9.5】【NYG的背包】【贪心】
- SSL2835 2017年11月4日提高组T2 字典序(堆+拓扑序)
- Jzoj5440 【NOIP2017提高A组冲刺11.1】背包
- (01背包扩展) 算法提高 金明的预算方案
- noip1996 砝码称重 - 提高组 (多重背包)
- 2017年11月4日提高组T2 字典序
- SSL2454 NOIP2015提高组模拟题八 采药(背包dp)
- JZOJ 5440. 【NOIP2017提高A组冲刺11.1】背包
- 树形依赖背包(codevs1155 金明的预算方案 2006年NOIP全国联赛提高组)
- 蓝桥杯 算法提高 金明的预算方案 有依赖的背包问题