UVA 1153 Keep the Customer Satisfied

Posted sahdsg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA 1153 Keep the Customer Satisfied相关的知识,希望对你有一定的参考价值。

https://cn.vjudge.net/problem/UVA-1153

题目

有 $n$ ($nleqslant800000$)个工作,已知每个工作需要的时间 $q_i$ 和截止时间 $d_i$(必须在此之前完成),最多能完成多少工作?工作只能串行完成。第一项任务开始的时间不早于时刻0。

题解

技术图片

考虑这样的图……

考虑不出来

放弃= =

题目提示按截止时间从小到大排序

因为是串行的,所以只用考虑接下来选择哪一个……

能选择的尽量选,不能选择的想办法和前面用时更长的替换,并且解不会变差。(知道答案编过程……不过好在知道这种贪心策略了)

AC代码

#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#include<bits/stdc++.h>
using namespace std;
#define REP(r,x,y) for(register int r=(x); r<(y); r++)
#define REPE(r,x,y) for(register int r=(x); r<=(y); r++)
#ifdef sahdsg
#define DBG(...) printf(__VA_ARGS__)
#else
#define DBG(...)
#endif

#define MAXN 800007
int n;
struct node{
	int q,d;
} arr[MAXN];
bool operator<(const node&l, const node&r) {
	return l.d<r.d || (l.d==r.d && l.q<r.q);
}

priority_queue<int,vector<int>,less<int> > pq;

int main() {
	int t;
	scanf("%d", &t);
	bool fi=false;
	while(0<t--) {
		if(fi) putchar(‘
‘); else fi=true;
		scanf("%d", &n);
		REP(i,0,n) {
			scanf("%d%d", &arr[i].q, &arr[i].d);
		}
		sort(arr,arr+n);
		int now=0;
		int ans=0;
		while(!pq.empty()) pq.pop();
		REP(i,0,n) {
			if(now+arr[i].q<=arr[i].d) {
				now += arr[i].q;
				pq.push(arr[i].q);
				ans++;
			} else {
				pq.push(arr[i].q);
				int k=pq.top(); pq.pop();
				now -= k;
				now += arr[i].q;
			}
		}
		printf("%d
", ans);
	}
	return 0;
}

 

以上是关于UVA 1153 Keep the Customer Satisfied的主要内容,如果未能解决你的问题,请参考以下文章

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

uva1153 Keep the Customer Satisfied

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

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

1153.Decode Registration Card of PAT(unordered_map)

1153 Decode Registration Card of PAT (25 分)