首页 > 其他分享 >CF773A Success Rate 题解

CF773A Success Rate 题解

时间:2023-11-02 20:24:05浏览次数:64  
标签:frac Success int 题解 ans mid long Rate Delta

Success Rate

(提供二分做法)

前言

听说是史上最简单蓝题,做了一下。

题意

已知 \(x,y,p,q\),通过只让 \(y\) 加 \(1\) 或 \(x,y\) 同时加 \(1\),使得满足:

\[\frac{x'}{y'}=\frac{p}{q} \]

思考

目标状态为 \(\frac{p}{q}\),考虑到这是个比值,自然 \(\frac{x'}{y'}=\frac{kp}{kp}\)。
明显地,这里的 \(k\) 如果合法,那就一定有更小的 \(k\)。

所以考虑二分。

限制条件呢?

因为无论如何决策,\(y\) 都会加 \(1\);而 \(x\) 不一定每一次决策都加 \(1\)。即 \(\Delta y\geq \Delta x\)。

所以保证 \(\Delta x \leq \Delta y\) 就好了。即 \(kp-x\leq kq-y\)。

需要注意的是,有一点需要特判:

  • \(p=0\) 时
    • \(x> 0\),输出 \(-1\)
    • \(x=0\),输出 \(0\)

代码

考虑到数据范围均小于 \(10^9\),所以右端点不可以取太大,否则越界变成负数,右端点取 \(10^{10}\),开个 long long 就好了。

code

#include<bits/stdc++.h>
using namespace std;

#define int long long

int x,y,p,q;

bool check(int md)
{
    return p*md-x<=q*md-y && p*md>=x;
}

void solve()
{
    scanf("%lld%lld%lld%lld",&x,&y,&p,&q);
    if(p==0)
    {
        if(x)
            puts("-1");
        else
            puts("0");
        return;
    }

    int l=1,r=1e10,mid,ans=-1;
    while(l<=r)
    {
        mid=l+r>>1;
        if(check(mid))
            r=mid-1,ans=mid;
        else
            l=mid+1;
    }
    
    if(ans==-1)
        puts("-1");
    else
        printf("%lld\n",ans*q-y);
}

signed main()
{
    signed T;
    scanf("%d",&T);
    while(T--)
        solve();
    return 0;
}

标签:frac,Success,int,题解,ans,mid,long,Rate,Delta
From: https://www.cnblogs.com/wang-holmes/p/17806203.html

相关文章

  • 【POJ 1256】Anagram 题解(全排列)
    描述你要编写一个程序,从一组给定的字母中生成所有可能的单词。示例:给定单词“abc”,您的程序应该-通过探索这三个字母的所有不同组合-输出单词“abc”、“acb”、“bac”、“bca”、“cab”和“cba”。在输入文件中的单词中,某些字母可能出现多次。对于给定的单词,您的程序不应多次......
  • CF1868B2 Candy Party (Hard Version) 题解
    Problem-1868B2-CodeforcesCandyParty(HardVersion)-洛谷相信大家已经看过SimpleVersion,这题和上题不同之处就在于如果\(b_i=2^x\),他可以被分解成\(2^x\)或\(2^{x+1}-2^x\),我们不妨起初固定一种方案,如果不满足条件后再把一部分换回去。我们强制钦定起......
  • CF227A Where do I Turn? 题解
    题目大意:\(A\),\(B\)在一条直线上。\(B\),\(C\)在一条直线上你从\(A\)走到了\(B\)去\(C\),问现在应该是直走、左转、还是右转。思路:分类讨论:分别求\(A\)到\(B\),\(B\)到\(C\)是什么方向,然后可得\(A\)到\(C\)的方向。Code:#include<bits/stdc++.h>usingnamesp......
  • CF333B题解
    分析发现只能跳\(n-1\)次,所以每个点一定是畅通无阻地抵达终点,所以有障碍的行和列放不了,并且每一个行或列最多放一个。因为同时跳,思考会不会跳到一起,发现如果不在正中间可以将起点放到另一头就不会跳到一起,如果在正中间就一定会跳到一起,所以正中间的行和列加一起最多只能放......
  • CF333A题解
    分析被除数一定,除数越小,商越大,所以选择合法的最小\(3_{x}\)。枚举指数即可,复杂度\(\mathcal{O(\log_{3}w)}\),\(w\)为值域\(1e18\),可以通过本题。代码#include<iostream>#defineintlonglongusingnamespacestd;constexprintMAXN(1000007);intf[MAXN];int......
  • P9740 「KDOI-06-J」ION 比赛 题解
    题目思路:先计算总分数\(sum\),\(c_i=\frac{100}{a_i}\)为每道题的每个测试点分数。如果总分数达到\(Au\)线,直接输出AlreadyAu.。否则计算到达\(Au\)线还需多少分\(p\),遍历所有题,求出每道题的失分,如果失分大于等于\(p\),则输出\(\lceil\frac{p}{c_i}\rceil\),即至......
  • Educational Codeforces Round 134 (Div.2) D 题解
    题目链接D.MaximumAND题目大意给定两组序列\(a\)\(b\),长度为\(n\),现有一新序列\(c\),长度也为\(n\)。其中,\(c_i=a_i\oplusb_i\)。定义\(f(a,b)=c_1\&c_2\&……\&c_n\)。现在你可以随意编排\(b\)序列的顺序,求\(f(a,b)\)的最大值。思路以下位运算均是......
  • Educational Codeforces Round 128 (Rated for Div. 2)
    添加链接描述C题显然二分0的数量,然后双指针,算一下前缀和后缀1的数量即可。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<map>#include<vector>#include<set>#defineAputs("YES")#defineBputs("NO&q......
  • 【python】-bash: /usr/local/bin/pip: /usr/bin/python: bad interpreter: No such f
    安装单独的第三方库时没有问题pipinstallpandas但是一旦使用requirement.txt批量安装第三方库时就会出现-bash:/recorddata/rebuydata/hppy/soft/python3/bin/pip3:/usr/local/source/hppy/soft/python3/bin/python3.6:badinterpreter:没有那个文件或目录badinterpreter......
  • CF1868B1 Candy Party (Easy Version) 题解
    Problem-1868B1-CodeforcesCandyParty(EasyVersion)-洛谷喵喵题。首先每个数最终肯定变成\(\overlinea\),如果\(\overlinea\)不是整数显然无解。然后记\(b_i=a_i-\overlinea\)表示每个数的偏差量,那\(b_i\)要满足能写成\(2^x-2^y\)的形式然后只需要......