有一枚硬币, 你要抛这枚硬币, 在抛硬币之前你可以和 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
#include
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 <" ";
// cout <// for(int i = 1;i <= n;++i)cout <" ";
// cout <1];prob+=b[1];ans=max(min(proa-cnt,prob-cnt),ans);//profit a,b;cnt是成本
// cout <<"ans:"<int flag=0;
// cout<1]<<" "<while(la1;
if(proa+a[la+1]<=prob){//proa+a[la+1]-cnt-1<=prob-cnt-1
proa+=a[++la];++cnt;
// cout << "la:"<"proa:"<// cout<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:"<"prob:"<// cout<0;
if(ans>min(proa-cnt,prob-cnt))break;
else ans=min(proa-cnt,prob-cnt);
}
if(flag)break;
}
printf("%.4f",ans);
return 0;
}
请写出你的初始思路