Problem B: 汀博尔
Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 32 Solved: 8
[ Submit][ Status][ Web Board]
Description
有 n 棵树,初始时每棵树的高度为 Hi,第 i 棵树每月都会长高 Ai。现在有个木料长度总量为 S 的订单,客户要求每块木料的长度不能小于 L,而且木料必须是整棵树(即不能为树的一部分)。现在问你最少需要等多少个月才能满足订单。
Input
第一行 3 个用空格隔开的非负整数 n,S,L,表示树的数量、订单总量和单块木料长度限制。
第二行 n 个用空格隔开的非负整数,依次为 H1,H2,…,Hn。
第三行 n 个用空格隔开的非负整数,依次为 A1,A2,…,An。
Output
输出一行一个整数表示答案。
Sample Input
3 74 512 5 22 7 9
Sample Output
7
HINT
测试点编号 | n | 特殊约定 |
---|---|---|
1 | n=1 | 1≤S≤Hi≤10000 |
2 | 1≤S,L,Hi,Ai≤10000 | |
3 | 1≤n≤1000 | |
4 | ||
5 | ||
6 | 1≤S,L,Hi,Ai≤109 | |
7 | ||
8 | ||
9 | 1≤n≤20000 | |
10 | ||
11 | 1≤S,L≤1018,1≤Hi,Ai≤109 | |
12 | ||
13 | 1≤n≤200000 | L=1 |
14 | S≤L | |
15 | 1≤S,L≤1018,1≤Hi,Ai≤109 | |
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,加了就过了。