小爱可以玩两个游戏,每个游戏各有?n?关,每过一关升一级,每关的通关时间是不同的。给定一个整数?t,表示小爱玩游戏的时间,请问她应该如何分配时间,才能让升级的次数达到最大?(不可以跳关)
第一行:两个整数?n?和?t;
第二行:n?个整数a[1]?,a[2]?,…,a[n]?,表示第一个游戏每个关卡的通关时间;
第三行:n?个整数?b[1]?,b[2]?,…,b[n]?,表示第二个游戏每个关卡的通关时间。
单个整数:表示最多能通过多少关。
输入:
4 22
6 8 10 7?
7 11 9 9输出:
3
说明:
选择通关6、7、8
如果可以跳关,那么直接两个数组sort一下就OK了,但这题不行。
一般人想到的是直接枚举,看每种情况哪种过关最多,直接输出。但这样只能打60%的分,不可取。
那么怎样求和呢?
运用前缀和可以更快的求出数组的每一元素相加之和。
#include <bits/stdc++.h>
using namespace std;
int n, t;
int a[100005], b[100005];
int ans = 0;
int main() {
cin >> n >> t;
for (int i = 1; i <= n; i++) {
cin >> a[i];
a[i] += a[i - 1];
}
for (int i = 1; i <= n; i++) {
cin >> b[i];
b[i] += b[i - 1];
}
int sheng;//剩余的时间
int p = n; //b游戏可以过几关
for (int i = 0; i <= n; i++) { //枚举a游戏通过从0关至n关的情况
sheng = t - a[i];
if (sheng < 0)
break;//处理越界问题
while (b[p] > sheng) {
p--;
}
ans = max(ans, i + p); //把答案设为最多关数
}
cout << ans;
return 0;
}