您的位置:首页 > 其它

HDU 6003 Problem Buyer(贪心)

2017-07-26 15:55 288 查看
/**
E - Problem Buyer
题意:主持人主持一场比赛需要M个题目,每个题目的难度要求是Ci,一个公司提供M个题目,每个题目的难度为[Ai,Bi],问主持人
最少需要购买多少个题目才能保证一定能办成这个比赛(买K个题目的时候公司从M个题目中任意挑选K个),不满足输出impossible

思路:对区间按左端点为关键字从小到大排序,举办比赛题目的难度从小到大排序,枚举每个难度,最终的结果一定是这样的:买的K个题目的
前K-1个题目的区间一定不包含这个难度,而最后一个满足,难度从左到右扫描,优先队列维护在这个点的区间数量,然后取max(n - 队列size+1)
+1是因为最后一个区间一定包含这个难度,最后扫描完一个点在队列要pop一个,代表需要给这个点一个区间,因为可能Ci, Ci+1都在一个区间内
**/

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
typedef long long ll;
const int maxn = 1e5 + 10;
const int INF = 1e8;
using namespace std;

typedef pair<int, int> par;
int T, n, m, kase = 1;
int C[maxn];
par pa[maxn];

int main() {
scanf("%d", &T);
while(T--) {
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++)
scanf("%d %d", &pa[i].first, &pa[i].second);
for(int i = 0; i < m; i++) scanf("%d", &C[i]);
priority_queue<int, vector<int>, greater<int> > que;
sort(pa, pa + n);
sort(C, C + m);
int ans = 0;
for(int i = 0, it = 0; i < m; i++) {
while(it < n && pa[it].first <= C[i]) que.push(pa[it++].second);
while(!que.empty() && que.top() < C[i]) que.pop();
if(que.empty()) { ans = -1; break; }
ans = max(ans, n - (int)que.size());
que.pop();
}
if(ans != -1) printf("Case #%d: %d\n", kase++, ans + 1);
else printf("Case #%d: IMPOSSIBLE!\n", kase++);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: