UVa1153 Keep the Customer Satisfied (贪心,优先队列)

链接:http://bak.vjudge.net/problem/UVA-1153

分析:将n个工作按截止时间d从小到大排序。用优先队列维护在当前截止时间di下,实现完成工作数的最大化时,选取的各个工作的需要时间。每次取一个工作i,先把它扔进队列中(这样保证n个工作都进过队列,在后面我们只需记录下从队列里删除的工作总数ans),计算得到cost(在截止时间di-1之前完成最大工作数所耗用的总时间)加上di的总耗时,如若超过了当前截止时间di,那么根据贪心的思想,从队列里删除一个最费时的工作ans++,同时要注意把删除掉的工作的耗时从总耗时cost中减去,最终答案就是n-ans。

 1 #include <cstdio>
 2 #include <queue>
 3 #include <algorithm>
 4 using namespace std;
 5
 6 const int maxn = 800000 + 5;
 7
 8 int n;
 9 pair<int, int> work[maxn];
10
11 int main() {
12     int T;
13     scanf("%d", &T);
14     while (T--) {
15         scanf("%d", &n);
16         for (int i = 0, a, b; i < n; i++) {
17             scanf("%d%d", &a, &b);
18             work[i].first = b;
19             work[i].second = a;
20         }
21         sort(work, work + n);
22         priority_queue<int> pq;
23         int ans = 0, cost = 0;
24         for (int i = 0; i < n; i++) {
25             cost += work[i].second;
26             pq.push(work[i].second);
27             if (cost > work[i].first) {
28                 cost -= pq.top();
29                 pq.pop();
30                 ans++;
31             }
32         }
33         printf("%d\n", n - ans);
34         if (T) printf("\n");
35     }
36     return 0;
37 }
时间: 2024-10-26 11:27:58

UVa1153 Keep the Customer Satisfied (贪心,优先队列)的相关文章

Uva 1153 Keep the Customer Satisfied (贪心+优先队列)

题意:已知有n个工作,已知每个工作需要的工作时间qi和截至时间di,工作只能串行完成,问最多能完成多少个工作 思路:首先我们按照截至时间从小到大排序,让它们依次进入优先队列中,当发生执行完成时间大于截至时间时,我通过优先队列把工作中最长的需要时间出队 优先队列的比较函数: struct cp { bool operator () (node a,node b) { //可以理解为我如何让后入队的优先出队 if(b.need>a.need) return true; else return fal

UVA-1153 Keep the Customer Satisfied (贪心)

题目大意:有n件工作,做每件工作的消耗时间为s,截止时间为d,问最多能做完几件工作. 题目分析:贪心策略:优先做截止时间靠前的,一旦做不完当前工作,则从已经做过的工作中删去一件耗时最长的,用当前工作取代之. 代码如下: # include<iostream> # include<cstdio> # include<vector> # include<queue> # include<cstring> # include<algorithm&

uva1153 Keep the Customer Satisfied

贪心加优先队列 (默认是小的在前,正好) //这里又很套路,设队列里的都是符合条件的考虑新加入的即可.再处理一下空队列的情况.很完美// 截止时间短的在前面,干的就多先根据截止日期排序优先队列根据完成所需时间排序首先队列里的都是能完成的策略:新加入的,如果在前面的完成后仍能完成,就直接加进去:不能,因为截止日期在更后,不影响其他的,比较top元素用的时间,更短就换掉(此时因为截止日期靠后,用的时间还短,所以能成立) #include <iostream> #include <cstdio

UVA - 1153 Keep the Customer Satisfied(贪心)

UVA - 1153 Keep the Customer Satisfied Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Description Simon and Garfunkel Corporation (SG Corp.) is a large steel-making company with thousand of customers. Keeping the customer s

UVA1153-Keep the Customer Satisfied(贪心)

Problem UVA1153-Keep the Customer Satisfied Accept: 222  Submit: 1706Time Limit: 3000 mSec Problem Description Input The input begins with a single positive integer on a line by itself indicating the number of the cases following, each of them as des

poj3190Stall Reservations(贪心+优先队列)

题目链接: 啊哈哈,点我点我 思路: 首先根据挤奶时间的先后顺序排序...然后将第一头牛加入优先队列..然后就是加入优先队列的牛应该根据越早结束挤奶那么优先级更高,如果时间结束点相等,那么开始时间早的优先级高... 然后从前向后枚举.如果碰到有牛的挤奶时间的开始值大于优先队列的首部的结束值,那么说明这两头牛可以一起公用一个挤奶房..然后从优先队列中删除这头牛..那么这个问题就得到解决了... 题目: Language: Default Stall Reservations Time Limit:

poj 2431 Expedition (贪心+优先队列)

Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6890   Accepted: 2065 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to

BZOJ 2151 种树 贪心+优先队列+HASH

题意:链接 方法:贪心+优先队列 解析: 首先裸上贪最大的肯定不对. DP可行么?可行,两个数组一个记录选一个记录不选好像差不多n^2? 不过还是想想贪心. 贪最大的为什么不对? 因为有可能它旁边的两个加起来比它更优越? 所以能否找到一点关系呢? 既然话都说到这了,两个加起来可能更优越. 所以我们在选了最大的之后是否应该回推一个值呢?代表选旁边俩. 我们发现选旁边俩是两个单位,选一个是一个单位,如果我们推回去某个值后这个值相当于对应删去一个单位选两个单位,即增加一个单位,这显然不会影响最终我们选

POJ1456Supermarket(贪心+优先队列)

Supermarket Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9103   Accepted: 3891 Description A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an int