zoukankan      html  css  js  c++  java
  • Codeforces

    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,他们的公倍数肯定在1e18范围内(p和q任意组合能得到的比值最多就是1e18/2,把1e18都枚举完肯定能遍历所有能构造出的情况),那么最大值肯定是1e18/q,多个1都不行。

    二分,老朋友了,while(1),当l==m的时候是边界,特判就好。

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    
    string a,b;
    string c;
    int main(){
        int t;
        scanf("%d",&t);
        while(t--){
            ll x,y,p,q;
            scanf("%lld%lld%lld%lld",&x,&y,&p,&q);
            ll l=1,r=1e18/q,m;
            ll ans;
            while(1){
                m=(l+r)>>1;
                //cout<<l<<" " <<r<<" "<<m<<endl;
    
                if(l==m){
                    ll del=l*q-y;
                    if(del>=0&&(x+del)>=l*p&&x<=l*p){
                        ans=l;
                    }
                    else if((r*q-y)>=0&&(x+(r*q-y))>=r*p&&x<=r*p){
                        ans=r;
                    }
                    else{
                        ans=-1;
                    }
                    break;
                }
                if(m*q<y){
                    l=m+1;
                    continue;
                }
                ll del=m*q-y;
                if((x+del)>=m*p&&x<=m*p){
                    r=m;
                    //cout<<m<<" ok"<<endl;
                }
                else{
                    l=m+1;
                }
            }
    
            printf("%lld
    ",ans==-1?-1:ans*q-y);
    
        }
    }

     其实还有直接用公式解的方法,设最终的状态为pt/qt,只要保证增量为正数即可,当然是pt>=x,qt>=y,还有错的题不会再变对,qt-pt>=y-x,三个式子直接解出来。

    这个方法要注意特判p==q的情况,这种时候不能作除法,还有p==0和q==0的时候。

  • 相关阅读:
    tensorflow2.0第1章 Tensorflow简介与环境搭建
    SIGAI机器学习第二十四集 聚类算法1
    SIGAI机器学习第二十三集 高斯混合模型与EM算法
    51nod1429 巧克力
    CTSC2018 Day2T1 Juice混合果汁
    CF1B Spreadsheets
    CF2B The least round way
    【模板】点分治
    【模板】AC自动机
    【模板】网络流-最大流 Dinic
  • 原文地址:https://www.cnblogs.com/Yinku/p/10414473.html
Copyright © 2011-2022 走看看