链接: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第一天的工资,煤气灶的价格,工资每天的增长量,答案不超过xll 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;}