有n只猴子,第i只猴子每過xi小時會連續吃香蕉yi小時。猴子從第二次開始每次休息結束後這只猴子連續吃香蕉的時間會增加zi小時。
給定n只猴子,每乙隻的x
i,yi,z
i,以及時間t,求在前t小時中,所有猴子共吃了多少小時。
對於乙隻猴子來說是這樣的:
從第1小時開始:
休息xi小時( 1 -> x
i )
吃yi小時( x
i + 1 -> x
i + y
i )休息x
i小時吃y
i+zi小時
休息xi小時
吃yi+z
i+zi小時
......
第一行兩個數n和t;之後n行,第i+1行每行三個數xi,yi,zi.
一行乙個數表示答案.示例1
10 1000000001 0 0
1 0 5
1 2 2
1 2 8
1 3 0
1 5 0
1 5 2
1 5 5
1 7 0
1 8 3
845787522
每只猴子分別吃了0,99993675,99990000,99994999,75000000,83333333,99990002,99993676,87500000,99991837小時
示例2
1 233333233 233 233
223081
那只猴子吃了223081小時
對於100%的資料:0 <= n <= 100000
0 <= t <= 2000000000
x + y + z > 0
0 <= x , y , z <= 2000000000
解析:如果直接暴力的話,必然會超時,所以肯定有o(n)或者o(n*log(n))的方法,其實仔細一想,這個是乙個等差數列,公差d = z[i], a1 = x[i] + y[i],an = a1 + (n-1)*d,然後就是求前n項的和sn = t,這裡不知道n,列乙個一元二次的方程解除n然後計算時間即可
**:
#includeusing namespace std;
typedef long long ll;
//d = z
//a1 = x+y
//a2 = a1+d
////an = a1 + (n-1)*d
////2*t = 2sn = n*(a1+an) = n*(2a1+(n-1)*d)
//ax^2+bx+c=0
////2a1*n+d*n^2-dn-2*t = 0
////d*n^2 + (2a1-d)n + (-2t) = 0
////a = d;
//b = 2a1-d
//c = -2t
////x =
////
//ans = n*x//
ll x[100009], y[100009], z[100009];
int main()
a = z[i];
b = 2ll*(x[i]+y[i])-a;
c = -2ll*t;
x = (long long)((-b+sqrt(b*b-4.0*a*c))/2.0/a + 1e-8);
if(x > 0)
}printf("%lld\n", ans);
return 0;
}
牛客練習賽6 A 二分
有n只猴子,第i只猴子每過xi小時會連續吃香蕉yi小時。猴子從第二次開始每次休息結束後這只猴子連續吃香蕉的時間會增加zi小時。給定n只猴子,每乙隻的x i,yi,z i,以及時間t,求在前t小時中,所有猴子共吃了多少小時。對於乙隻猴子來說是這樣的 從第1小時開始 休息xi小時 1 x i 吃yi小時...
牛客練習賽9
時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 珂朵莉想每天都給威廉送禮物,於是她準備了n個自己的本子 她想送最多的天數,使得每天至少送乙個本子,但是相鄰兩天送的本子個數不能相同 珂朵莉最多送幾天禮物呢 第一行乙個整...
牛客練習賽15
時間限制 c c 2秒,其他語言4秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 第一次期中考終於結束啦!沃老師是個語文老師,他在評學生的作文成績時,給每位學生的分數都是乙個小於10的非負小數。amy 8.99999999999999999999...