思路分析:
直接贪心,先把有的钱数的大的值先花了再说,但是有一点要注意,花面值为1的钱的时候不要直接花去,要考虑不用1的话可能话大的用的更少,举个例子,比如,花完了大的和小的还剩2,但大的是3,这样比如就少话一个1了,这样只要一个3就可以,否则就要两个1了
那么这一步该如何操作呢?
此时的m是剪完了大的值后的钱数
(m-na)/b+1 是队伍数(先上取整)*b,如果<=m,那么就说明做法是可行的
if((m-na)%b!=0&&((m-na)/b+1)*b<=m)
m=((m-na)/b+1)*b;
完整代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#define int long long
using namespace std;
int n,t,a,b,na,nb,m;
signed main()
{
cin>>t;
while(t--){
a=1;
cin>>m>>b>>na>>nb;
int bb=min(nb,m/b);//大的能花多少是多少
m-=bb*b;
if(m<=na){//用给的钱就能应付了
cout<<0<<endl;
continue;
}
if((m-na)%b!=0&&((m-na)/b+1)*b<=m)
m=((m-na)/b+1)*b;
else m-=na;
cout<<m/b+m%b<<endl;
}
return 0;
}