2 条题解

  • 1
    @ 2024-8-3 21:00:58

    一种分治的写法

    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #define rep(x,a,b) for (int x=int(a);x<=(int)(b);x++)
    #define drp(x,a,b) for (int x=int(a);x>=(int)(b);x--)
    #define cross(x,a) for (int x=hd[a];~x;x=nx[x])
    #define ll long long
    using namespace std;
    ll x,y,n,ans,m,l,r;
    double xx,yy;
    /*int round_(double number)
    {
        return (number > 0.0) ? floor(number + 0.5) : ceil(number - 0.5);
    }手写round*/
    int main()
    {
    	freopen("film.in","r",stdin);
    	freopen("film.out","w",stdout);
        while (scanf("%lf%lf%lld",&xx,&yy,&n)!=EOF)
        {
            x=round(xx*10000),y=round(yy*10000);//?四舍五入 
            if (x!=100000)//判断是否为十分
            {
                x+=500;//消除精度问题,最坏的情况是x数值比较大 
                x*=n;//总投票数 
                //?总投票数必须要 
                if (x%10000==0) x-=10000;
                else x-=x%10000;
            }
            else x*=n;//十分没有误差,直接求出总票数 
            //处理精度
            l=0,r=100000000000;//二分边界定大点,放心不会超
            ans=0;//投票数 
            do 
            {
                m=(l+r)>>1;//非负整数等同于处于2 
                if (x+m*10000<((y+500)*(n+m))) ans=m,r=m;//每次加一分平均分下落肯定最快
                else l=m;
            }while (l+1<r);//好像我的二分不是很规范啊。。。
            if (xx<=yy) ans=0;//判断初始情况,这种情况不需要再投票了 
            printf("%lld\n",ans);//输出结果		
        }
        return 0; 
    }
    

    信息

    ID
    1366
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    49
    已通过
    6
    上传者