策略打怪兽

牛牛在玩一个线性魔塔游戏,地图是一条[-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;
}

猜你喜欢

转载自blog.csdn.net/qq_24624539/article/details/108451552