B. No Time for Dragons 贪心
原创
©著作权归作者所有:来自51CTO博客作者wx634d08b5232a4的原创作品,请联系作者获取转载授权,否则将追究法律责任
http://codeforces.com/gym/101149/problem/B
这是很基本的贪心题。
B题,考虑样例
1 1
1 1
1 1
1 1
999999 1
这里应该是999999就够了
如果是按伤亡排序的话,快排是不稳定的,如果先杀了前面那些,答案不是最优。
应该是把人数 - 伤亡最大的优先,因为这样留下来的人是最多的。
主要想写下怎么找最大值。
记ans为答案值,t为现在拥有的人数。 ans and t is zero before
如果t小于当前要拥有的人数,那么ans就应该加上他们的差值。
因为。ans表示满足前i个的最小值。然后拥有的人数不够的话,那是因为前面的扣费太多,ans加上差值,就会刚好满足第i个的扣费
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 2e5 + 20;
struct node {
int val, kill;
bool operator < (const struct node & rhs) const {
return (val - kill) > (rhs.val - rhs.kill);
}
}a[maxn];
int n;
void work() {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i].val >> a[i].kill;
}
sort(a + 1, a + 1 + n);
LL t = 0;
LL ans = 0;
for (int i = 1; i <= n; ++i) {
if (t < a[i].val) {
ans += (a[i].val - t);
t = a[i].val;
}
t -= a[i].kill;
}
cout << ans << endl;
}
int main() {
#ifdef local
freopen("data.txt","r",stdin);
#endif
IOS;
work();
return 0;
}
View Code