牛牛在玩一个线性魔塔游戏,地图是一条[-n,n]的直线段。
怪物在[-n,-1].[1,n]的每个位置都有分布。同向的怪物互相遮挡,比如如果要攻击
位置为3的怪物,必须在攻击之前击杀位置为1和2的怪物,如果要攻击-2位置的怪
物,也必须先击杀位置-1的怪物。
每一个怪物需要消耗勇者a;的生命值,杀死某个怪物后会给勇者恢复b;的血量。
勇者的生命值在非负的时候被认为牺牲,勇者的生命值没有上限。
牛牛想知道,勇士初始时拥有多少生命值,可以用策略杀完所有怪物。
输入描述:
第一行输入一个整数n,如题目中所示。
随后一行﹐输入2n个整数ai﹐分别表示按[-n,-1],[1,n]的顺序﹐杀死怪物
消耗的勇者的生命值·
随后一行﹐输入2n个整数ai﹐分别表示按[-n,-1],[1,n]的顺序﹐杀死怪物
后勇者恢复的生命值·
对于20%的数据有n≤5。
对于40%的数据有n≤10。
对于60%的数据有n≤30。
对于80%的数据有n≤100。
对于100%的数据有n≤1000,0≤ai ,bi ≤106
俞出描述:
输出一行一个整数﹐表示答案·
示例1输入输出示例仅供调试,后台判题数据般不包:
输入
2
6 5 8 9
1 20 1 0
输出
7
说明
先击杀-1位置的怪物﹐生命值-5=2﹐恢复+20=22
再击杀位置-2的怪物﹐生命值-6=16﹐恢复+1=17。
再击杀位置1的怪物﹐生命值-8=9,恢复+1=108
再击杀位置2的怪物﹐生命值-9=1。
此时﹐勇者已经击杀了所有怪物。
通过70%版本,两个策略,先右后左,或先左后右
#include<bits/stdc++.h>
typedef long long int ll;
using namespace std;
int main(){
int n;
cin>>n;
// n = 2;
int m = 2 * n;
int sum = 0;
vector<int> a(m);
vector<int> b(m);// = {-5, 15, -7, -9};
for(int i = 0;i < m;++i){
cin>>a[i];
}
for(int i = 0;i < m; ++i){
cin>>b[i];
}
int ans1 = 0;
for(int i = n; i < m; ++i){
sum -= a[i];
if(sum < 0){
ans1 = ans1 + 1 + abs(sum);
sum = 1;
}
sum += b[i];
}
for(int i = n - 1; i >= 0 ; --i){
sum -= a[i];
if(sum < 0){
ans1 = ans1 + 1 + abs(sum);
sum = 1;
}
sum += b[i];
}
if(sum == 0) ans1++;
//
sum = 0;
int ans2 = 0;
for(int i = n - 1; i >= 0 ; --i){
sum -= a[i];
if(sum < 0){
ans2 = ans2 + 1 + abs(sum);
sum = 1;
}
sum += b[i];
}
for(int i = n; i < m; ++i){
sum -= a[i];
if(sum < 0){
ans2 = ans2 + 1 + abs(sum);
sum = 1;
}
sum += b[i];
}
if(sum == 0) ans2++;
int ans = min(ans1 , ans2);
cout<<ans<<endl;
return 0;
}
通过50%版本,综合策略,从中间开始,哪边掉的血最小去哪边
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int main(){
ll n;
cin>>n;
// n = 2;
ll m = 2 * n;
ll sum = 0;
vector<ll> a(m);
vector<ll> b(m);// = {-5, 15, -7, -9};
for(ll i = 0;i < m;++i){
cin>>a[i];
}
for(ll i = 0;i < m; ++i){
cin>>b[i];
}
vector<ll> c(m);
for(ll i = 0; i < m; ++i){
c[i] = b[i] - a[i];
}
ll ans1 = 0;
int left = n - 1, right = n;
while(left >= 0 && right < m){
if(c[left] > c[right]){
sum -= a[left];
if(sum < 0){
ans1 = ans1 + 1 + abs(sum);
sum = 1;
}
sum += b[left];
left--;
}
else{
sum -= a[right];
if(sum < 0){
ans1 = ans1 + 1 + abs(sum);
sum = 1;
}
sum += b[right];
right++;
}
}
while(left >= 0){
sum -= a[left];
if(sum < 0){
ans1 = ans1 + 1 + abs(sum);
sum = 1;
}
sum += b[left];
left--;
}
while(right < m){
sum -= a[right];
if(sum < 0){
ans1 = ans1 + 1 + abs(sum);
sum = 1;
}
sum += b[right];
right++;
}
cout<<ans1<<endl;
return 0;
}