Problem B: 汀博尔

Problem B: 汀博尔

Time Limit: 1 Sec   Memory Limit: 512 MB
Submit: 32   Solved: 8
[ Submit][ Status][ Web Board]

Description

有 nnn 棵树,初始时每棵树的高度为 HiH_iHi,第 iii 棵树每月都会长高 AiA_iAi。现在有个木料长度总量为 SSS 的订单,客户要求每块木料的长度不能小于 LLL,而且木料必须是整棵树(即不能为树的一部分)。现在问你最少需要等多少个月才能满足订单。

Input

第一行 333 个用空格隔开的非负整数 n,S,Ln,S,Ln,S,L,表示树的数量、订单总量和单块木料长度限制。

第二行 nnn 个用空格隔开的非负整数,依次为 H1,H2,,Hn

第三行 nnn 个用空格隔开的非负整数,依次为 A1,A2,,An

Output

输出一行一个整数表示答案。

Sample Input

3 74 512 5 22 7 9

Sample Output

7

HINT




















































































测试点编号nnn特殊约定
1n=1n = 1n=11≤S≤Hi≤100001 \leq S \leq H_i \leq 100001SHi10000
21≤S,L,Hi,Ai≤100001 \leq S, L, H_i, A_i \leq 100001S,L,Hi,Ai10000
31≤n≤10001 \leq n \leq 10001n1000
4
5
61≤S,L,Hi,Ai≤1091 \leq S, L, H_i, A_i \leq 10^91S,L,Hi,Ai109
7
8
91≤n≤200001 \leq n \leq 200001n20000
10
111≤S,L≤10181 \leq S, L \leq 10^{18}1S,L10181≤Hi,Ai≤1091 \leq H_i, A_i \leq 10^91Hi,Ai109
12
131≤n≤2000001 \leq n \leq 2000001n200000L=1L = 1L=1
14S≤LS \leq LSL
151≤S,L≤10181 \leq S, L \leq 10^{18}1S,L10181≤Hi,Ai≤1091 \leq H_i, A_i \leq 10^91Hi,Ai109
16
17
18
19
20



来自 CodePlus 2017 11 月赛,清华大学计算机科学与技术系学生算法与竞赛协会 荣誉出品。

Credit:idea/郑林楷 命题/郑林楷 验题/王聿中

Git Repo:https://git.thusaac.org/publish/CodePlus201711

感谢腾讯公司对此次比赛的支持。

#include <iostream>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <cmath>
#include <stack>
#include <string>
#include <queue>
#include <algorithm>
#include <cstdio>
using namespace std;
#define INF 0x3f3f3f3f
int h[200005], a[200005];
long long n, s, l;
bool judge(long long mid) {
	bool flag = false;
	long long sum = 0;
	for (int i = 0; i < n; ++i) {
		long long t = (long long)h[i] + (long long)a[i] * mid;
		if (t < l) {
			continue;
		}
		sum += t;
		if (sum >= s) {
			return true;
		}
	}
	return false;
}
int main() {

	while (~scanf("%lld%lld%lld",&n,&s,&l)) {
		for (int i = 0; i < n; ++i) {
			scanf("%d", &h[i]);
		}
		int Max = 0;
		for (int i = 0; i < n; ++i) {
			scanf("%d", &a[i]);
			Max = max(Max, a[i]);
		}
		long long left = 0, right = max(s ,l)/ Max + 1, mid;
		long long ans = right;
		while (left <= right) {// month
			mid = ((right - left) >> 1) + left;
			if (judge(mid)) {
				right = mid - 1;
				ans = mid;
			}
			else {
				left = mid + 1;
			}
		}
		printf("%lld\n", ans);
	}
	return 0;
}
巨坑爹的题啊,数据范围写的贼坑爹,没加max(s,l)WA,加了就过了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值