二分 煤氣灶

2022-05-05 23:00:15 字數 1245 閱讀 7068

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 32768k,其他語言65536k

64bit io format: %lld

小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≤1e9,n+d>0

1≤m≤1e18

1≤x≤1e9

題意:每天都能得到工資,一開始為n,每一天都可能在比前一天多領d(注意d可能為0),問最少多少天你領的工資的總和能超過買煤氣灶需要的m元,天數不超過x

思路:求和問題,每天都可能多增加d的值,所以這是乙個初值為n,公差為d的等差數列求和,等差數列求和公式:sn=a0*n+(n*(n-1)*d/2),又注意到m最大是1e18,若要讓等差數列之和sn>=m,則sn會超出long long的範圍,所以要對公式進行變形,

設n為初值,in為天數,d為公差,m為總和至少需要大於的值,得到

n*in+(in*(in-1)*d)/2>=m

2*(n*in)+(in(in-1)*d)>=2*m

in*(in-1)*d>=2*(m-(n*in))

同時注意到1<=in<=x,所以就想到二分一下答案

1 #include2

using

namespace

std;

3 typedef long

long

ll;4

ll n,m,d,x;

5bool check(ll in)8

intmain()

16 printf("

%lld\n

",mid);17}

18/*

**19

n*in+(in*(in-1)*d)/2>=m

202*(n*in)+(in(in-1)*d)>=2*m

21in*(in-1)*d>=2*(m-(n*in))

22**

*/

牛客C 煤氣灶 二分

通過高中數學知識求得通項公式,同時一定要注意答案為mid而不是l,可見二分的情況還是要具體分析討論 include include include include include include include include include include include using namesp...

安全煤氣灶

呵呵,最近老婆學習燉湯,然我大飽口福。但是老婆卻因此做了許多 奇怪的夢,涉及最多的就是煤氣忘了關,沙鍋煮破等涉及到家庭安全 的煤氣問題。聽了老婆的抱怨,我也頗有感觸,大家知道,煲湯的時候要用小火 這樣的小火很容易因為風兒熄滅。而且煲湯的時間比較長,總是做在灶前看著是不現實的 也難怪我老婆會擔心。突然...

牛客寒假演算法基礎集訓營6 B 煤氣灶

上圖所示的是題目給的樣例,四天每天賺的錢 一開始想著這題遍歷肯定超時,應該可以用二分,隨後反應過來,直接解個方程不就好啦,f x m f x 為工作x天賺的錢 f x d 2 x2 n d 2 x 雖然很簡單,不過忘記考慮d 0的情況,wa得我。include include using names...