链接: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 > 0
1 ≤ m ≤ 1018
1 ≤ x ≤ 109
分析:
由等差数列的求和公式可得:Sk = (a1+ak) * k / 2
即 Sk = (2n - d + kd) * k /2
若 k为答案,则有 Sk-1 < m ≤ Sk
又因为 答案不超过x 且 Sk单调递增,所以可用二分法求解
ps.为方便处理,SK 和 m 同乘以2
以下代码:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
LL n,m,d,x;
LL S(LL k)
{return (2*n-d+k*d)*k;
}
int main()
{scanf("%lld %lld %lld %lld",&n,&m,&d,&x);LL l=1,r=x,mid,a,b;while(l<=r){mid=(l+r)/2;a=S(mid);b=S(mid-1);if(b<2*m&&2*m<=a){printf("%d",mid);break;}else if(a<2*m)l=mid;else if(b>=2*m)r=mid;}return 0;
}