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