题意:把分数x/y->p/q的最少操作次数,每次可以使y++,x++或者y++ x<=y,p<=q<=1e9
最后若可行肯定是kp/kq=p/q 如果k可行,则说明操作了k*q-y次
判定:x的增加次数不能超过y k*p-x<=k*q-y -> y-x<=k(q-p) 若k可行,则k+1一定也可行,倍数k有单调性,二分即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+20;
ll x,y,p,q;
bool check(ll k)
{
ll a=k*p,b=k*q;
ll d1=a-x,d2=b-y;
if(d1<0||d2<0||d1>d2)
return false;
return true;
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%I64d%I64d%I64d%I64d",&x,&y,&p,&q);
ll l=0,r=1e9;
ll ans=-1;
while(l<=r)
{
//kp/kq=p/q
ll mid=(l+r)>>1;
if(check(mid))
{
ans=mid*q-y;
r=mid-1;
}
else
l=mid+1;
}
printf("%I64d\n",ans);
}
return 0;
}

本文介绍了一个算法问题:如何通过最少的操作将一个分数转换为另一个分数。操作包括分子加一、分母加一或同时分子加分母。使用二分查找确定最小操作数,确保最终分数相等且不超过限制。
451

被折叠的 条评论
为什么被折叠?



