Newcoder 26 A.猴子吃香蕉(二分)
阿新 • • 發佈:2018-11-02
Description
有 只猴子,第 只猴子每過 小時會連續吃香蕉 小時。猴子從第二次開始每次休息結束後這隻猴子連續吃香蕉的時間會增加 小時。
給定 只猴子,每一隻的 ,以及時間 ,求在前 小時中,所有猴子共吃了多少小時。
Input
第一行兩個數 和 ;之後 行,第 行每行三個數 .
Output
一行一個數表示答案.
Sample Input
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
Sample Output
845787522
Solution
天后猴子花費 小時,其中 小時在吃,二分 ,剩下一段時間單獨算即可,注意期間乘法會爆 ,此時只需要特判 的情況然後用除法來避免該情況
Code
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
ll x,y,z,t;
int main()
{
ll res=0;
scanf("%d%lld",&n,&t);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&x,&y,&z);
if(z==0)
{
res+=t/(x+y)*y+max(t%(x+y)-x,0ll);
continue;
}
ll l=0,r=2e9,mid,k=0,temp;
while(l<=r)
{
mid=(l+r)/2;
if(mid*(x+y)>t||mid*(mid-1)/2>t/z)temp=t+1;
else temp=mid*(x+y)+mid*(mid-1)/2*z;
if(temp<=t)k=mid,l=mid+1;
else r=mid-1;
}
res+=k*y+k*(k-1)/2*z+max(t-k*(x+y)-k*(k-1)/2*z-x,0ll);
}
printf("%lld\n",res);
return 0;
}