题干:(Uva不放题干了)

题目大意:(实在是自己懒得写网上找了一个)

解题报告:

   调度问题,直接贪心出完成任务需要的时间最长的那个人排序,就行了。

方法正确性的证明以前也写过了,,这里就不再写了,,还是贴那篇题解中附的(这篇题解应该也是采用的交换证明法)。

那篇题解

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
struct Node {
	int a,b;
} node[MAX];
bool cmp(Node a,Node b) {
	return a.b>b.b;
}
int n;
int main()
{
	int iCase = 0;
	while(~scanf("%d",&n)) {
		if(n == 0) break;
		for(int i = 1; i<=n; i++) scanf("%d%d",&node[i].a,&node[i].b);
		int ans = 0,tmp=0;
		sort(node+1,node+n+1,cmp);
		for(int i = 1; i<=n; i++) {
			tmp += node[i].a;
			ans = max(ans,tmp + node[i].b);
		}
		printf("Case %d: %d\n",++iCase,ans);
	}


	return 0 ;
}

今天讲课学长说了一种贪心的证明思路貌似很正确啊。,先假设找到了一种最优解,然后看我们贪心的方法是否会改变这个最优解,如果改变不了,那么说明我们的方法一定是没有问题的。