描述
有 N+1 个城镇。其中 i 个城镇正受到 Ai 个怪物的攻击。
我们有 N 个英雄。第i个英雄可以打败攻击第i个或第(i+1)个城镇的怪物,总共最多可以打败Bi个怪物。
英雄们最多可以合作打败的怪物总数是多少?
输入描述
N
A1 A2 ... AN+1
B1 B2 ... BN
输出描述
打印英雄能打败的怪物总数上限。
用例输入 1
2 3 5 2 4 5
用例输出 1
9
用例输入 2
3 5 6 3 8 5 100 8
用例输出 2
22
用例输入 3
2 100 1 1 1 100
用例输出 3
3
提示
样本输出 1
如果英雄们按以下方式选择要打败的怪物,他们总共可以打败九个怪物,这是最大结果。
- 第一位英雄打败攻击第一个城镇的两只怪物和攻击第二个城镇的两只怪物。
- 第二位英雄击败攻击第二座城镇的三只怪物和攻击第三座城镇的两只怪物。
限制因素
- 所有输入值均为整数。
- 1≤N≤105
- 1≤Ai≤109
- 1≤Bi≤109
解析:
这段代码主要解决了一个与英雄和怪物有关的问题。在这个问题中,有N+1
个城镇,每个城镇受到一定数量的怪物攻击。同时,有N
个英雄,每个英雄可以打败攻击其对应城镇或下一个城镇的怪物,但每个英雄有一个打败怪物的数量上限。目标是找出英雄们最多可以合作打败的怪物总数。
代码:
#include<bits/stdc++.h>
using namespace std;
// 定义常数N,表示城镇和英雄的数量上限
const int N = 10000007;
// 定义全局变量
int n; // 城镇数量(实际上英雄数量是n,因为有一个额外的城镇)
long long c; // 用来记录英雄们最多可以合作打败的怪物总数
int a[N], b[N]; // a[i]表示第i个城镇受到的攻击怪物数量,b[i]表示第i个英雄可以打败的怪物数量上限
int main()
{
cin >> n; // 读取城镇数量(或英雄数量)
// 读取每个城镇受到的攻击怪物数量
for(int i = 1; i <= n + 1; i++) cin >> a[i];
// 读取每个英雄可以打败的怪物数量上限
for(int i = 1; i <= n; i++) cin >> b[i];
// 遍历每个英雄
for(int i = 1; i <= n; i++)
{
// 如果当前英雄可以打败的怪物数量大于第i个城镇受到的攻击怪物数量
if(b[i] > a[i])
{
// 当前英雄首先打败第i个城镇的所有怪物
b[i] -= a[i];
c += a[i];
// 当前英雄如果还有剩余的打败能力,尝试打败第i+1个城镇的部分怪物
// 注意:使用min函数确保不超过英雄剩余的打败能力和第i+1个城镇受到的怪物数量
c += min(a[i + 1], b[i]);
// 更新第i+1个城镇剩余的怪物数量
a[i + 1] -= min(a[i + 1], b[i]);
}
// 如果当前英雄可以打败的怪物数量小于或等于第i个城镇受到的攻击怪物数量
else
{
// 当前英雄只能打败其对应的第i个城镇的部分或全部怪物
c += b[i];
// 由于当前英雄不能打败第i+1个城镇的怪物,所以不需要更新a[i+1]
}
// // 调试用,输出当前c的值
// cout << c << endl;
}
// 输出英雄们最多可以合作打败的怪物总数
cout << c << endl;
return 0;
}