牛客练习赛6 A 【二分】
2017-11-17 21:33
176 查看
题目描述
有n只猴子,第i只猴子每过xi小时会连续吃香蕉yi小时。猴子从第二次开始每次休息结束后这只猴子连续吃香蕉的时间会增加zi小时。给定n只猴子,每一只的xi,yi,zi,以及时间t,求在前t小时中,所有猴子共吃了多少小时。
对于一只猴子来说是这样的:
从第1小时开始:
休息xi小时( 1 -> xi )
吃yi小时( xi + 1 -> xi + yi )
休息xi小时
吃yi+zi小时
休息xi小时
吃yi+zi+zi小时
......
输入描述:
第一行两个数n和t;之后n行,第i+1行每行三个数xi,yi,zi.输出描述:
一行一个数表示答案.
示例1
输入
10 100000000 1 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 233333 233 233 233
输出
223081
说明
那只猴子吃了223081小时
备注:
对于100%的数据: 0 <= n <= 100000 0 <= t <= 2000000000 x + y + z > 0 0 <= x , y , z <= 2000000000
#include <bits/stdc++.h>
using namespace std;
long long n,m;
long long check( long long x,long long y,long long z)
{
long long l=0,r=m,mid,s;
while(l<=r)
{
mid=(l+r)/2;
s=mid*y+mid*(mid-1)/2*z+mid*x;
//cout<<"sad "<<s<<endl;
if( s<=m&&s>0 )
{
l=mid+1;
}
else
r=mid-1;
}
return l-1;
}
int main()
{
while(cin>>n>>m)
{
long long ans=0;
long long x,y,z;
for(long long i=0;i<n;i++)
{
cin>>x>>y>>z;
long long mid=check(x,y,z);
cout<<mid<<endl;
//cout<<mid<<endl;
long long s=m-(mid*y+mid*(mid-1)/2*z+(mid)*x);
if(s>=x)
{
ans+=m-(mid+1)*x;
}
else
{
ans+=mid*y+mid*(mid-1)/2*z;
}
}
cout<<ans<<endl;
}
}
相关文章推荐
- 牛客练习赛13 B 幸运数字Ⅱ【前缀和 + 位运算 + 二分】
- 牛客练习赛13 B 幸运数字Ⅱ 【暴力】【二分】
- 牛客练习赛13 A B C F【二分+思维】
- 牛客练习赛13 幸运数字Ⅱ(BFS,DFS,二分,思路)
- 牛客练习赛6 D 世界上最可爱的珂朵莉 贪心
- 牛客练习赛6 B 点权和 树点权和
- 牛客练习赛3 F 监视任务 每个区间K个 树状数组+贪心
- 骰子的游戏(牛客练习赛7)
- 牛客练习赛7 C 随机树(DFS序+线段树+快速幂)
- 牛客练习赛7 B
- 牛客练习赛8
- HihoCoder1655 : 第K小最简真分数([Offer收割]编程练习赛39)(唯一分解+容斥定理+二分)(不错的数学题)
- 牛客练习赛9
- 牛客练习赛12
- 牛客练习赛12 D 图图 (高斯消元)
- 牛客练习赛13-幸运数字I
- 牛客练习赛13 --E(dp)
- 牛客练习赛4反素数
- 牛客练习赛6 B题 点权和
- 牛客练习赛6 D 世界上最可爱的珂朵莉 贪心