P4058
[Code+#1]木材
题目描述
有 \(n\) 棵树,初始时每棵树的高度为 \(H_i\),第 \(i\) 棵树每月都会长高 \(A_i\)。现在有个木料长度总量为 \(S\) 的订单,客户要求每块木料的长度不能小于 \(L\),而且木料必须是整棵树(即不能为树的一部分)。现在问你最少需要等多少个月才能满足订单。
输入格式
第一行 \(3\) 个用空格隔开的非负整数 \(n,S,L\),表示树的数量、订单总量和单块木料长度限制。
第二行 \(n\) 个用空格隔开的非负整数,依次为 \(H_1,H_2, ... ,H_n\)。
第三行 \(n\) 个用空格隔开的非负整数,依次为 \(A_1,A_2, ... ,A_n\)。
输出格式
输出一行一个整数表示答案。
样例 #1
样例输入 #1
3 74 51
2 5 2
2 7 9
样例输出 #1
7
鬼知道为什么二分一直只有70pts
先贴着吧
点击查看代码
#include<bits/stdc++.h>
using namespace std;
unsigned long long n,s,l,a[200005],h[200005],t[200005];
unsigned long long check(unsigned long long x)
{
// cout<<"?\n";
memset(t,0,sizeof(t));
for(unsigned long long i=1;i<=n;i++)t[i]=h[i]+a[i]*x;
unsigned long long tot=0;
for(unsigned long long i=1;i<=n;i++)
{
if(t[i]>=l)tot+=l;
}
return tot;
}
signed main()
{
ios::sync_with_stdio(false);
cin>>n>>s>>l;
for(unsigned long long i=1;i<=n;i++)cin>>h[i];
for(unsigned long long i=1;i<=n;i++)cin>>a[i];
unsigned long long L=0,R=10000000000000000,mid,ans;
if(check(0)>=s){cout<<"0\n";return 0;}
// if(check(1)>=s){cout<<"1\n";return 0;}
while(L<=R)
{
// cout<<L<<" "<<R<<"\n";
mid=(L+R)>>1;
if(check(mid)<s)L=mid+1,ans=mid;
else R=mid-1;
}
cout<<L<<"\n";
return 0;
}
此生无悔入OI 来生AK IOI

浙公网安备 33010602011771号