猴子吃香蕉
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 65536K,其他语言131072K
64bit IO Format: %lld
空间限制: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 i )
休息x i小时
吃y i+z i小时
休息x i小时
吃y i+z i+z i小时
......
从第1小时开始:
休息x i小时( 1 -> x i )
吃y i小时( x i + 1 -> x i + y i )
休息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
空间限制: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;
}