CodeForce-807C Success Rate(二分数学)

Success Rate

CodeForces - 807C

给你4个数字 x y p q ,要求让你求最小的非负整数b,使得 (x+a)/(y+b)==p/q,同时a为一个整数且0<=a<=b。

(0?≤?x?≤?y?≤?109; 0?≤?p?≤?q?≤?109; y?>?0; q?>?0)

解法:

(x+a)/(y+b)==p/q;

-->

x+a=np;

y+b=nq;

-->

a=np-x;

b=nq-y;

-->

二分n;

#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
#define _ ios::sync_with_stdio(false),cin.tie(0)

const int MAXN = 5010;
const int INF = 0xfffffff;
typedef long long ll;

int t;
ll x,y,p,q;

int main()
{
    cin>>t;
    while(t--)
    {
        cin>>x>>y>>p>>q;
        ll l=0,r=1e9,ans=-1;
        while(l<=r)
        {
            ll mid=(l+r)>>1;
            ll a=mid*p-x,b=mid*q-y;
            if(a>=0&&b>=0&&a<=b)
            {
                ans=mid;
                r=mid-1;
            }
            else
                l=mid+1;
        }
        if(ans==-1)
            cout<<-1<<endl;
        else
            cout<<ans*q-y<<endl;
    }
    return 0;
}
时间: 2024-10-11 04:07:05

CodeForce-807C Success Rate(二分数学)的相关文章

Codeforces 807C - Success Rate

题目链接:http://codeforces.com/problemset/problem/807/C 题目大意:给你T组数据,每组有x,y,p,q四个数,x/y是你当前提交正确率,让你求出最少需要再提交几次可以达到目标正确率p/q; 解题思路:假设提交B次,正确A次,那么可以得到(x+A)/(y+B)=p/q,可以推出x+A=k*p,y+B=k*q.那么A=k*p-A,B=K*q-A; 这样我们只需要二分枚举k,判断A,B是否满足(0<=A<=B)即可. 1 #include<iost

codeforce C. Success Rate

写完这道题目才发现自己对二分的理解太浅了 这题是典型的利用二分"假定一个问题可行并求最优解" 二分是通过不断缩小区间来缩小解的范围,最终得出解的算法 我们定义一个c(x) 表示判断函数 如果对任意y>=x 当x满足条件的时候 y也满足条件 那么我们就一个不断缩小区间范围来确定最后的解 好扯了这么多犊子 来说下这道题目.. 我们的目的是对A,B 有 (x+A)/(y+B) == (p/q) 其中A<=B 那么可以转换为 A+x=k*p  B+y=k*q; 既 A=k*p-x,

Codeforces - 773A - Success Rate - 二分

https://codeforces.com/problemset/problem/773/A 一开始二分枚举d,使得(x+d)/(y+d)>=p/q&&x/(y+d)<=p/q,错在这些数是离散的,不能由两边异号判定一定存在这个交点. 然后改成枚举d,使得y=d*q,这样就一定是倍数了.然后就是要想清楚了,找不到这样卡在中间的d,其实都是因为d不够大的原因,d够大保证是可以的除非正确率是100%. 然后就是二分的上界,按道理q的最大值是1e9,y的最大值也是1e9,他们的公倍

AC日记——Success Rate codeforces 807c

Success Rate 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define ll long long inline void in(ll &now) { char Cget=getchar();now=0; while(Cget>'9'||Cget<'0

Codeforces Round #412 C. Success Rate

Success Rate You are an experienced Codeforces user. Today you found out that during your activity on Codeforces you have made y submissions, out of which x have been successful. Thus, your current success rate on Codeforces is equal to x?/?y. Your f

URAL 1948 H - The Robot on the Line 二分 + 数学

给定一条二次函数 f (x) = a * x * x + b * x + c 求一个最小的k,使得f(x) + f(x + 1) + f(x + 2) ..... + f(x + k - 1) 不等于 0 恒成立. 首先把参数统一写成 x + t这样的形式,然后带入去 化简有:a*x*x + (2*a*t+b)*x + a*t*t+b*t+c //现在的t是从0--k-1 列出k个式子,求和(简单的数列求和).然后就得到一条关于x的二次函数,用判别式判断即可. 为什么能二分? 因为单调.化简后可

POJ 1759 Garland(二分+数学递归+坑精度)

POJ 1759 Garland  这个题wa了27次,忘了用一个数来储存f[n-1],每次由于二分都会改变f[n-1]的值,得到的有的值不精确,直接输出f[n-1]肯定有问题. 这个题用c++交可以过,g++交过不了, f[i]=2+2*f[i-1]-f[i-2]; f[0]=A,f[1]=x; 二分枚举x的值,最终得到B的值(不是f[n-1]), 上述递推式是非齐次的二阶递推式,解其齐次特征方程,可以得到f[n-1]的齐次时的表达式,对于非齐次的,目前我还没法求出通式, B与f[n-1]的关

codeforce 702C Cellular Network 二分答案

http://codeforces.com/contest/702 题意:n个村庄,m个机站,问机站最短半径覆盖完所有村庄 思路:直接二分答案 二分太弱,调了半天..... 1 // #pragma comment(linker, "/STACK:102c000000,102c000000") 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <s

Codeforces Round #426 (Div. 1) A.The Meaningless Game (二分+数学)

题目链接: http://codeforces.com/problemset/problem/833/A 题意: 给你 \(a\) 和 \(b\),两个人初始化为 \(1\).两个人其中一方乘以 \(k^2\),另一方就乘以 \(k\).问你能不能达到 \((a,b)\) 这个最终状态. 题解: 设 \(X\), \(P\) 表示两个乘积的集合. 那么,显然: \(S^{2}*P=a\) ------ 1 \(S*P^{2}=b\) ------ 2 所以:\(a*b = S^{3}*P^3\)