闯关升级 上海月赛2020年7月丙组T5
题目描述
内存限制: 256Mb 时间限制: 1000 ms
小爱正在参加一个闯关游戏。游戏的关卡分为两类,一类与文艺相关,一类与体育相关。每一类游戏都有n关,每通一关,需要的时间是不一样的。挑战文艺类(或体育类)游关卡戏时,必须按照顺序通关,即必须先通过文艺类(或体育类)的前一关,才能挑战文艺类(或体育类)的下一关。小爱挑战这些关卡的时间有限,记为t,在挑战中,她可以自由地在两类关卡中切换。请问如何才能在有限的时间内通过尽量多的关卡呢?
输入格式
第一行:两个整数n和t
第二行:n个整数 a1,a2,…,an,表示文艺类关卡的通关时间
第三行:n个整数 b1,b2,…,bn, 表示体育类关卡的通关时间。
输出格式
单个整数:表示在时限内能够完成挑战的最大关数。
数据范围
对于30% 的数据,1≤n≤20
对于60% 的数据,1≤n≤1000
对于100% 的数据,1≤n≤100000,1≤t≤1,000,000,000,1≤ai,bi≤10000。
样例数据
输入:
4 22
6 8 10 7
7 11 9 9
输出:
3
说明:
选择通关6,7,8
提交代码
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e5+10;
ll n, t, a[maxn], b[maxn];
int main()
{
scanf("%lld%lld", &n, &t);
for(int i=1; i <= n; i++) scanf("%lld",&a[i]),a[i]+=a[i-1];
for(int i=1; i <= n; i++) scanf("%lld",&b[i]),b[i]+=b[i-1];
int ans = -1;
for (int i=0; i <= n; i++){
if (a[i]>t) break;
int p = upper_bound(b+1,b+1+n, t-a[i])-(b+1)+i;
ans = max(ans, p);
}
cout << ans;
return 0;
}