题目描述
有两类彩票A,B,各有
n种,其中A的第
i种的奖金记为
a
i
,B的第
i种的奖金记为
b
i
.
小W可以购买其中任意种彩票(每一种只能买一次或不买),每种花费1元。
购买完毕后,开奖系统会选择A类中奖或B类中奖,小W会获得中奖的那一类中所有购买的彩票的奖金。为了自己的利益,开奖系统会让小W获得奖金更少的那一类中奖。
问小W最多能赚多少(奖金减去买彩票的花费)
输入格式
第一行一个正整数n。
接下来n行,每行两个正实数 a_i,b_i
.保证输入的实数不会超过四位小数。
输出格式
输出一个非负实数表示小W最多能赚多少。请精确到小数点后恰好四位。
样例
Input 1
4
1.4 3.7
1.2 2
1.6 1.4
1.9 1.5
Output 1
0.5000
code:
#include <algorithm>
using namespace std;
constexpr int N=5e5+10;
long long a[N],b[N];
inline void get(long long&a,long long b){if(b>a)a=b;}
bool cmp(long long a,long long b){
return a>b;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
double x,y;
scanf("%lf%lf",&x,&y);
a[i]=x*10000+0.01;
b[i]=y*10000+0.01;
}
sort(a+1,a+n+1,cmp);
sort(b+1,b+n+1,cmp);
long long ans=0,cnt1=0,cnt2=0,bi=0;
for(int i=0;i<n;i++){
if(i)cnt1+=a[i];
while(bi<n&&cnt2+b[bi+1]<cnt1)cnt2+=b[++bi];
get(ans,(cnt2-(i+bi)*10000)/**10000*/);
if(bi<n)get(ans,(cnt2-(i+bi+1)*10000)/**10000*/);
cout<<cnt2<<' '<<i<<' '<<bi<<' '<<'\n';
}
printf("%.4lf\n",ans/10000.0);
}```
看题解写了一遍,但还是错。