牛客寒假算法基础集训营6 B煤气灶

链接: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;
	
 } 
发布了48 篇原创文章 · 获赞 1 · 访问量 4575

猜你喜欢

转载自blog.csdn.net/tsunagxy/article/details/86774187