• ZROIDay4-比赛解题报告


    ZROIDay4-比赛解题报告

    扯闲话

    感觉这个出题人的题做起来全都没感觉啊,今天又凉了,T1完全不知道什么意思,T2只会暴力,T3现在还不懂什么意思,真的太菜了

    A

    题意半天没搞懂爆零GG了,讲了一下才知道什么意思,还是比较有趣的一道题,一位大佬20分钟就切了

    设默认押法国队本金是(v),则期望收益(p*vx),当(p*xv-v>=0)时,即(p*x >= 1)他才会押法国队,克罗地亚队类似。从这可以看到会押本金的人在排序后一定是一个前缀

    然后容易发现,若法国队赔率一定,你的收益与克罗地亚队成一个单峰函数关系,因为法国队赢了,你要用他们押克罗地亚的本钱去偿还他们的赌金,然而赔率一旦过大,克罗地亚赢的话同理

    于是我们枚举押法国队赢的人数(相当于枚举赔率),再二分出押克罗地亚队的最佳人数(相当于二分最佳赔率),然后枚举法国队赢或输你的收益,最后统计答案即可。当然正如第一个样例一样还可能出现所有人都不押才是最佳的情况。

    还有这题读入巨大,要用double的读入优化

    代码:

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cctype>
    #include <cmath>
    #include <queue>
    #define ll long long 
    #define ri register int 
    using std::sort;
    using std::min;
    using std::max;
    template <class T>inline void read(T &x){
    	x=0;int ne=0,xx=0;char c;
    	while(!isdigit(c=getchar()))ne=c=='-';
    	xx=c-48;
    	while(isdigit(c=getchar()))xx=(xx<<3)+(xx<<1)+c-48;
    	if(c!='.'){
    	    x=ne?-xx:xx;
    	    return ;
    	}
    	int tot=1;double ans=1.0*xx;
    	double y=getchar()-48;
    	while(isdigit(c=getchar())){y=y*10+c-48;tot++;}
    	while(tot--){y=y/10;}
    	x=ne?-(ans+y):(ans+y);
    }
    const int maxn=1000005;
    const int inf=0x7fffffff;
    struct Dat{
    	double a,p,x,y,sumx,sumy;
    	Dat(){x=y=0;}
    }dat[maxn];
    inline	bool cmpx(const Dat &a,const Dat &b){
    		return a.x<b.x;
    	}
    inline	bool cmpy(const Dat &a,const Dat &b){
    	    return a.y<b.y;
    	}
    int n;
    int main(){
    	read(n);
    	for(ri i=1;i<=n;i++){
    		read(dat[i].a),read(dat[i].p);
    		//printf("%lf %lf
    ",dat[i].a,dat[i].p);
    		dat[i].x=1/dat[i].p,dat[i].y=1/(1-dat[i].p);
    	}
    	sort(dat+1,dat+1+n,cmpx);
    	for(ri i=1;i<=n;i++)dat[i].sumx=dat[i-1].sumx+dat[i].a;
    	sort(dat+1,dat+1+n,cmpy);
    	for(ri i=1;i<=n;i++)dat[i].sumy=dat[i-1].sumy+dat[i].a;
    	double tmp1,tmp2,ans=-inf;
    	for(ri i=0;i<=n;i++){
    		int l=0,r=n,mid;
    		while(l<=r){
    			mid=(l+r)>>1;
    			tmp1=dat[i].sumx*(1-dat[i].x)+dat[mid].sumy;
    			tmp2=dat[i].sumx+dat[mid].sumy*(1-dat[mid].y);
    			ans=max(ans,min(tmp1,tmp2));
    			if(tmp1<tmp2)l=mid+1;
    			else r=mid-1;
    		}	
    	}
    	printf("%lf
    ",ans);
    	return 0;
    }
    

    B

    毒瘤数据结构,不会

    C

    题目看不懂,还要特征多项式!?

  • 相关阅读:
    关于js中"window.location.href"、"location.href"、"parent.location.href"、"top.location.href"的用法
    对于json数据的应用01
    关于session应用(1)session过期时间设置
    关于session应用(2)JAVA中怎么使用session
    Jquery常用技巧(3)
    0101对称二叉树 Marathon
    0112路径之和 & 0113所有路径之和 Marathon
    0106105从中序与后序遍历序列中构造二叉树 Marathon
    0110平衡二叉树 Marathon
    0513找树左下角的值 Marathon
  • 原文地址:https://www.cnblogs.com/Rye-Catcher/p/9440546.html
Copyright © 2020-2023  润新知