3620. 大鱼吃小鱼
Time limit per test: 2.0 seconds
Memory limit: 256 megabytes
oxx 玩一个经典的大鱼吃小鱼的游戏。
- 任意时刻只能吃大小小于等于自己的鱼。
- 任何时刻都要保证鱼的大小是正整数。
- 当吃了第 i 条鱼之后自己的大小 x 会变为 x+ai。
oxx 想知道他初始鱼的大小至少需要多大才能吃完这 n 条鱼。吃的顺序可以任意。
Input
第一行一个整数 n (1≤n≤106) 表示鱼的条数。
接下去 n 行,每行两个整数 wi,ai (1≤wi≤109,−109≤ai≤109),分别表示鱼的大小,和吃完鱼之后会膨胀的差。
Output
输出一个整数表示吃完所有鱼的初始大小的最小值。
Examples
Input
3 10 2 3 -1 2 5
Output
5
Note
至少需要 5,先吃第三条变为 10,再吃第一条变为 12,最后吃第二条变为 11。
一道贪心题 排序后按顺序将相差的体积加起来就是答案 不过要注意:任何时刻都要保证鱼的大小是正整数。
开始没注意到这点wa了几发
接下来就是排序方法了
- a正的优先
- 正的中 w 小的优先
- 负的中 w+a 大的优先
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
using namespace std;
struct node{
long long a,b;
};
bool cmp(node x,node y){
if(x.b>=0&&y.b>=0){
return x.a<y.a;
}
else if(x.b<0&&y.b<0){
return x.a+x.b>y.a+y.b;
}
else{
return x.b>y.b;
}
}
node s[1000000];
int main()
{
long long n;
while(~scanf("%lld",&n)){
for(int i=0;i<n;i++){
scanf("%lld %lld",&s[i].a,&s[i].b);
}
sort(s,s+n,cmp);
long long flag=1,ans=1,sum=0;
for(int i=0;i<n;i++){
if(flag<=s[i].a){
sum=s[i].a-flag;
flag=s[i].a+s[i].b;
}
else{
sum=0;
flag=flag+s[i].b;
}
if(flag<1){
sum=sum+1-flag;
flag=1;
}
ans=ans+sum;
}
printf("%lld\n",ans);
}
return 0;
}