题目来源:https://codeforces.com/contest/1256/problem/A
翻译:
题目描述
你身上有 a 个 n 元的硬币和 b 个 1 元的硬币。请问能不能在不找零的情况下购买 s元的物品。
输入格式
本题有多组数据。
第一行一个数 q代表有 q组数据。
接下来的 q 行,每行有 4 个数,a,b,n,s含义如题。
输出格式
对于每组数据,如果能在不找零的情况下购买 s 元的物品,则输出"YES" ,反之则输出"NO"。
题目分析:首先我们想着是先尽量用大额的,用n面值的钱数小于等于s的时候,然后再用1面值的进行凑,显然符合要求。那么问题就是求出几张n面值的才小于等于s,就可以用s/n求出有几张,但是这个时候存在一种情况,就是s/n,可能小于a,所以我们要求min(s/n,a),然后再用1面值的来凑,如果总价值大于等于s,则YES,否则NO。
ps:注意使用long long 因为int的数量级为10的9次方。
先来个TLE代码,暴力!!超时!!
#include<iostream>
using namespace std;
int main(){
int q;
cin>>q;
while(q--){
int a,b,n,s;
cin>>a>>b>>n>>s;
while(a*n>s){
a--;
}
if((a*n+b)>=s){
cout<<"YES"<<endl;
}else cout<<"NO"<<endl;
}
return 0;
}
正确代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int q;
cin>>q;
while(q--){
long long a,b,n,s;
cin>>a>>b>>n>>s;
// while(a*n>s){ //暴力不行
// a--;
// }
// if((a*n+b)>=s){
// cout<<"YES"<<endl;
// }else cout<<"NO"<<endl;
long long MIN=min(a,s/n);
if((MIN*n+b)>=s){
cout<<"YES"<<endl;
}else cout<<"NO"<<endl;
}
return 0;
}