牛客练习赛6 A 【二分】

来源:互联网 发布:华为软件视频会议 编辑:程序博客网 时间:2024/05/24 04:14


题目描述

有n只猴子,第i只猴子每过xi小时会连续吃香蕉yi小时。猴子从第二次开始每次休息结束后这只猴子连续吃香蕉的时间会增加zi小时。

给定n只猴子,每一只的xi,yi,zi,以及时间t,求在前t小时中,所有猴子共吃了多少小时。
 对于一只猴子来说是这样的:
从第1小时开始: 
休息xi小时( 1 -> xi ) 
吃yi小时( xi + 1 -> xi + y)
休息xi小时
吃yi+zi小时
休息xi小时
吃yi+zi+zi小时
......

输入描述:

第一行两个数n和t;

之后n行,第i+1行每行三个数xi,yi,zi.

输出描述:

一行一个数表示答案.
示例1

输入

10 1000000001 0 01 0 51 2 21 2 81 3 01 5 01 5 21 5 51 7 01 8 3

输出

845787522

说明

每只猴子分别吃了0,99993675,99990000,99994999,75000000,83333333,99990002,99993676,87500000,99991837小时
示例2

输入

1 233333233 233 233

输出

223081

说明

那只猴子吃了223081小时

备注:

对于100%的数据:0 <= n <= 1000000 <= t <= 2000000000x + y + z > 00 <= 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;    }}


原创粉丝点击