CF1538G Gift Set 题解

Super_Cube

2024-11-19 21:50:11

Solution

Solution

红糖与蓝糖等价,所以令 x\le y,a\le b

特判 a=b,此时答案为 \left\lfloor\dfrac{x}{a}\right\rfloor

做一次 a,b 再做一次 b,a 使得红蓝均减少 a+b 是很好的策略,所以先想办法使得 xy 接近。每做一次 a,b 会使 xy 的差值减少 b-a,于是先做 c=\min\left\{\left\lfloor\dfrac{y-x}{b-a}\right\rfloor,\left\lfloor\dfrac{x}{a}\right\rfloor,\left\lfloor\dfrac{y}{b}\right\rfloor\right\} 次操作,再做 d=\left\lfloor\dfrac{x-ca}{a+b}\right\rfloor 次均匀减少。

现在还剩下 x-ca-d(a+b) 个红糖,y-cb-d(a+b) 个蓝糖,此时有可能还可以再做一次操作,需要判断下。

Code

#include<bits/stdc++.h>
int T,n,m,x,y,a,b;
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d%d",&n,&m,&x,&y);
        if(n>m)std::swap(n,m);
        if(x==y){
            printf("%d\n",n/x);
            continue;
        }
        if(x>y)std::swap(x,y);
        a=std::min((m-n)/(y-x),std::min(n/x,m/y));
        b=(n-a*x)/(x+y);
        if(n-a*x-b*(x+y)>=x&&m-a*y-b*(x+y)>=y)++a;
        printf("%d\n",a+(b<<1));
    }
    return 0;
}