链接:https://ac.nowcoder.com/acm/problem/21860
来源:牛客网
小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≤10^9^ ,n+d>0
1<m< 10^18^
1<x<10^9^
Sk = (2n - d + kd) * k /2
由于数据太大,所以用二分查找
Code:
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <cmath>
#include <map>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{ll n,m,d,x;cin>>n>>m>>d>>x;ll l=1,r=x,mid,a,b;while(l<=r){mid=(l+r)/2;a=(2*n-d+mid*d)*mid;b=(2*n-d+(mid-1)*d)*(mid-1);if(b<2*m&&a>=2*m){printf("%d\n",mid);break;}else if(a<2*m)l=mid+1;else if(b>=2*m)r=mid-1;}return 0;
}