牛客练习赛6A&D

猴子吃香蕉


时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 65536K,其他语言131072K
64bit IO Format: %lld

题目描述

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

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

输入描述:

第一行两个数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<iostream>
using namespace std;
int main(){
    long long n,t,x,y,z,ans=0;
    cin>>n>>t;
    while(n--){
        cin>>x>>y>>z;
        long long temp=1;
        while(temp*x+temp*y+temp*(temp-1)*z/2<=t){
            temp=temp*2;
        }
  		long long l=temp/2,r=temp;
        while(l<r){
            long long mid=(l+r)/2;
            if(mid*x+mid*y+mid*(mid-1)*z/2<=t)
            l=mid+1;
            else
                r=mid-1;
        }
        temp=l;
        while(temp*x+temp*y+temp*(temp-1)*z/2>=t)
        temp--;
        long long tt=temp*y+temp*(temp-1)*z/2;
        ans+=tt;
        if(t-tt-temp*x-x>0)
        ans+=t-tt-x-temp*x;       
    }
    cout<<ans<<endl;
    return 0;
}
世界上最可爱的珂朵莉


时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 65536K,其他语言131072K
64bit IO Format: %lld

题目描述

我永远喜欢珂朵莉~!

有两个长为n的序列a[i]与b[i]

你可以把任意不多于x个a序列中的数变成y

你可以把所有序列b中的数减去一个非负数t

你可以把a序列和b序列分别任意打乱

要求对于1 <= i <= n满足a[i] >= b[i]

求t的最小值


输入描述:

第一行三个数n,x,y
之后一行n个数表示a序列
之后一行n个数表示b序列

输出描述:

一行一个非负数表示答案
示例1

输入

2 0 0
6 4
8 9

输出

4
示例2

输入

8 6 4
1 9 2 6 0 8 1 7
6 4 6 4 8 9 8 9

输出

2

备注:

对于100%的数据,0 <= n <= 200000 , 0 <= x,y <= 2000000000
0<=a[i],b[i]<=2000000000

简单模拟。



#include<iostream>
#include<algorithm>
using namespace std;
long long n,x,y;
long long a[200010],b[200010];
int main(){
    cin>>n>>x>>y;
    for(long long i=0;i<n;i++){
        cin>>a[i];
    }
    for(long long i=0;i<n;i++){
        cin>>b[i];
    }
    sort(a,a+n);
    long long cnt=0;
    for(long long i=0;i<n;i++){
        if(a[i]>=y||cnt>=x){
            break;
        }
        else{
            a[i]=y;
            cnt++;
        }
    }
    sort(a,a+n);
    sort(b,b+n);
    long long ans=0;
    for(long long i=0;i<n;i++){
        if(a[i]-b[i]<ans){
            ans=a[i]-b[i];
        }
    }
    ans=ans*(-1);
    cout<<ans<<endl;
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没想好叫什么名字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值