召集各位虐菜(我)
题目
有一枚硬币, 你要抛这枚硬币, 在抛硬币之前你可以和 2n 个庄家下注, 对于第 1≤i≤n 个庄家, 你可以选择给他 1 块钱, 如果你抛的硬币最后正面朝上, 那么庄家会返还给你 ai 块钱(ai 不一定是整数), 否则就不给你了。 对于第 n+1≤i≤2n 个庄家, 你仍然可以选择给他 1 块钱, 如果你抛的硬币最后反面朝上, 那么庄家会返还给你 ai 块钱(ai 不一定是整数)。
输入格式
第一行一个数 n。
接下来 2n 个数, 第 i 个数表示 ai。 ai 最多有 4 位小数
输出格式
一行一个小数表示答案, 保留 4 位小数。
样例:
输入:
4
1.4 1.2 1.6 1.9 3.7 2 1.4 1.5
输出:
0.5000
code(0分代码)
#include<bits/stdc++.h>
using namespace std;
int n,la=1,lb=1;
float a[50005],b[50005],proa,prob,ans,cnt=2;
bool cmp(float &a,float &b)
{
return a > b;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%f",&a[i]);
for(int i=1;i<=n;++i)
scanf("%f",&b[i]);
sort(a+1,a+n+1,cmp);sort(b+1,b+n+1,cmp);
// for(int i = 1;i <= n;++i)cout <<a[i]<<" ";
// cout <<endl;
// for(int i = 1;i <= n;++i)cout <<b[i]<<" ";
// cout <<endl;
proa+=a[1];prob+=b[1];ans=max(min(proa-cnt,prob-cnt),ans);//profit a,b;cnt是成本
// cout <<"ans:"<<ans<<endl;
int flag=0;
// cout<<proa+a[la+1]<<" "<<prob<<endl;
while(la<n&&lb<n)
{
flag=1;
if(proa+a[la+1]<=prob){//proa+a[la+1]-cnt-1<=prob-cnt-1
proa+=a[++la];++cnt;
// cout << "la:"<<la<<"proa:"<<proa <<endl;
// cout<<min(proa-cnt,prob-cnt)<<endl;
flag=0;
if(ans>min(proa-cnt,prob-cnt))break;
else ans=min(proa-cnt,prob-cnt);
}
if(prob+b[lb+1]<=proa){
prob+=b[++lb];++cnt;
// cout << "lb:"<<lb<<"prob:"<<prob <<endl;
// cout<<min(proa-cnt,prob-cnt)<<endl;
flag=0;
if(ans>min(proa-cnt,prob-cnt))break;
else ans=min(proa-cnt,prob-cnt);
}
if(flag)break;
}
printf("%.4f",ans);
return 0;
}