CF1183C Computer Game题解
思路
题目请大家自行阅读,翻译已经通俗易懂了。
- 这道题非常像小学数学里的鸡兔同笼问题。
- 鸡兔同笼有很多解法,我在这里用的是假设法。
- 第一步,把脚少的拎出来,脚多的也可以,但是脚少的方便判断,这里数据小的一方是
b ,如果n \times b \ge k ,直接输出-1 即可,最小的都减不了,最后的结果一定不大于0 。 - 另一种情况,为了弥补到不了
k ,把剩余的部分拿去除以a 和b 的差,如果大于n ,取n 即可。 - 这里感谢zhouzihe
的题解,给出了很不错的解释,解释如下。
为什么
k 还要再减一呢?因为最终k 是要大于0 的,所以要至少留下1 。 - 注意事项:不要开
int,要开long long。
代码实现
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll t;
int main(){
cin>>t;
for(ll i=1;i<=t;++i){ //循环
ll k,n,a,b,ans;
cin>>k>>n>>a>>b; //输入每次询问的变量
if(n*b>=k){ //如果范围超了
cout<<"-1\n"; //直接输出-1
}else{
ans=min(n,(k-n*b-1)/(a-b)); //否则就按鸡兔同笼的步骤进行操作
cout<<ans<<"\n"; //将答案输出
}
}
return 0;
}