Codeforces Round #570 (Div. 3)C.Computer Game
http://codeforces.com/contest/1183/problem/C
大致题意 给出四个数k,n,a,b,找出满足以下条件最大的i
a*i+(n-i)*b<k并且还有两个小细节
本来第一反应写了个暴力,从N贪到0,但是后来TE了,才想到这是一个简单的二分,从0到n这个值的变化是具有单调性的,所以说只要不断的缩小范围就可以了
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#define ll long long
#define pb push_back
using namespace std;
int main()
{
ll T,k,n,a,b,i,flag;
cin>>T;
while(T--)
{
cin>>k>>n>>a>>b;
flag=0;
if (b*n>=k)
flag=-1;//减n次怎么减都会<0
else if (a*n<k)
flag=n;//减n次怎么减都>0
else{
ll right=n-1,left=1,mid;
while(left<=right)
{
mid=(right+left)/2;
if(a*mid+b*(n-mid)>=k)
right=mid-1;
else
left=mid+1;
flag=right;
}
}
cout<<flag<<endl;
}
return 0;
}