牛客練習賽6A&D

猴子喫香蕉


時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 65536K,其他語言131072K
64bit IO Format: %lld

題目描述

有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 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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章