链接:https://ac.nowcoder.com/acm/contest/332/B
来源:牛客网
题目描述
小j开始打工,准备赚钱买煤气灶。
第一天,小j的工资为n元,之后每天他的工资都比前一天多d元。
已知煤气灶需要m元,求小j最少工作几天才能买到煤气灶。
输入描述:
四个整数 n,m,d,x
分别表示小j第一天的工资,煤气灶的价格,工资每天的增长量,答案不超过x
输出描述:
一个数表示答案
示例1
输入
10 100 20 100
输出
4
说明
10+30+50+70>=100
备注:
0≤n,d≤109,n+d>00≤n,d≤109,n+d>0
1≤m≤10181≤m≤1018
1≤x≤109
第一次用的暴力居然过了_(:з」∠)_看来数据还是挺水的((
实际上应该是用二分答案的
第一天工资n,第二天为n+d,第三天n+2d……可推出第i天的工资和为n×i+d×i×(i−1)/2
但直接n×i+d×i×(i−1)/2>=m 会爆long long
所以移项成d*i*(i-1)≥2(m−n∗i)
然后开始二分答案((
以下代码:
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
int main()
{
ll n,m,r,d;
cin>>n>>m>>d>>r;//小j第一天的工资,煤气灶的价格,工资每天的增长量,答案不超过x
ll l=0;
ll mid;
while(l<=r){
mid=(l+r)/2;
ll t=d*mid*(mid-1);
ll t2=2*(m-n*mid);
if(t>=t2){//符合条件
r=mid-1;
}else{
l=mid+1;
}
}
cout<<l<<endl;
return 0;
}