Description
n场战争,每场战争需要派a[i]名士兵去,幸存者b[i]人,问如何安排这些战争能够使得最后派出的总人数最少(一名士兵可以参加多次战争,但其只被派出了一次)
Input
第一行一整数n表示战争数量,之后n行每行两个整数a[i]和b[i]分别表示派出的人数和幸存的人数(1<=n<=2e5,1<=b[i]<=a[i]<=1e9)
Output
输出最少需要派出的人数
Sample Input
2
7 4
5 1
Sample Output
8
Solution
贪心,因为战死的人数是一定的,肯定要先开始那些损失数少的战争,这样多活下来的士兵可以参加更多的战争,故对a[i]-b[i]升序排即为最佳安排
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 222222
int n;
struct node
{
int a,b;
bool operator<(const node&c)const
{
if(a-b!=c.a-c.b)return a-b>c.a-c.b;
return a<c.a;
}
}p[maxn];
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)scanf("%d%d",&p[i].a,&p[i].b);
sort(p,p+n);
ll ans=p[0].a,pre=p[0].a-p[0].b;
for(int i=1;i<n;i++)
{
if(pre<p[i].a)ans+=p[i].a-pre,pre=p[i].a;
pre-=p[i].b;
}
printf("%I64d\n",ans);
}
return 0;
}