OI生涯打的第一场CF比赛,写篇题解纪念一下吧

------------
可以想到先尽量用面值为1的硬币来凑,然后再用面值为n的硬币来补足。先算出用上所有面值为1的硬币还差多少钱,然后判断用面值为n的硬币够不够补足就可以了。计算需要面值为n的硬币的数量的时候,注意是否需要加1的判断。还有一个需要注意的点,有可能用面值为1的硬币就够了,即$b>=s$,有可能会出现没有特判这个情况导致 Wrong answer on test 2 的情况。

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll t,a,b,n,s;
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>a>>b>>n>>s;
        if(((s-b)%n==0 && a>=(s-b)/n)||((s-b)%n!=0 && a>=(s-b)/n+1 && ((s-b)/n+1)*n<=s)|| b>=s)//分别判断能整除,不能整除和直接凑够的情况
            puts("YES");
        else
            puts("NO");
    }
    return 0;
}
01-03 01:29