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;
}
posted @ 2023-01-21 10:20  PKU_IMCOMING  阅读(20)  评论(0)    收藏  举报