两类彩票 WA 0pts qt

题目描述
有两类彩票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);
}```
看题解写了一遍,但还是错。
2 个赞