列表

详情


MT50. D塔2

描述

在 D这款游戏中,英雄和小兵都可以对对方的防御塔造成伤害,但是只有当对敌方防御塔最后的伤害是由英雄造成时,才会得到相应的金钱奖励。 现在小明正在玩 D,操作英雄带着一波兵进入了对方的塔下进行攻击。已知:
1. 一共有 个小兵,小兵的攻击力为 ,所有小兵对塔的攻击是同时进行的,小兵的攻击冷却为 t0 
2. 小明的英雄有一个技能可以对塔造成伤害,伤害值为 ;英雄的普通攻击也可以对塔造成的伤害,伤害值为 。小明的英雄普通攻击的冷却为 t1 ,技能冷却为 t2  
3. 小兵的攻击,小明的普通攻击和小明的技能攻击,只要冷却时间一到,就会马上攻击;小明的普通攻击和技能攻击可以同时施展;如果小兵和英雄同时攻击,小兵的伤害算在前。 已知现在对方的塔还剩下s的血量,所有小兵的第一次攻击和英雄的第一次普通攻击和技能攻击在初始时刻同时进行,问小明可以得到破坏该塔的金钱奖励么? 注意:这里冷却是指连续两次攻击之间的等待时间,英雄的普通攻击和技能攻击的冷却两者互不干预。如果冷却是 ,某次攻击发生在时间 ,那么时间 才可以继续攻击。假定攻击立即生效。
数据范围:

输入描述

第一行一个整数T,表示测试组数;

接下来一行一个整数s,表示塔的剩余血量;

接下来一行4个整数n,d,x,y,含义如题面;

接下来一行3个整数t0,t1,t2,含义如题面

输出描述

对于每组测试数据输出”YES”表示小明的英雄可以补到,”NO”表示不能。(输出不包括引号)

示例1

输入:

1
3
1 1 1 1
1 1 1

输出:

YES

原站题解

C++ 解法, 执行用时: 2ms, 内存消耗: 380KB, 提交时间: 2020-07-23

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int T=0;
    while(cin>>T)
    {
        int s=0, n=0, d=0,x=0,y=0,t0=0,t1=0,t2=0;
        for(int i=0;i<T;i++)
        {
            vector<pair<int,int>> dp={{2,0},{1,0},{0,0}};
            cin>>s>>n>>d>>x>>y>>t0>>t1>>t2;
            int lastblood=3;
            while(s)
            {
                pair<int,int> w=dp[2];
                if(w.first==0)
                {
                    s-=n*d;
                    w.second+=t0;
                }
                else if(w.first==1)
                {
                    s-=y;
                    w.second+=t1;
                }
                else
                {
                    s-=x;
                    w.second+=t2;
                }
                if(s<=0)
                {
                    lastblood=w.first;
                    break;
                }
                if(w.first==0)
                {
                    int j=1;
                    for(;j>=0;j--)
                    {
                        if(dp[j].second<w.second)
                            dp[j+1]=dp[j];
                        else
                            break;
                    }
                    dp[j+1]=w;
                }
                else
                {
                    int j=1;
                    for(;j>=0;j--)
                    {
                        if(dp[j].second<=w.second)
                            dp[j+1]=dp[j];
                        else
                            break;
                    }
                    dp[j+1]=w;
                }
            }
            if(lastblood==0)
                cout<<"NO"<<endl;
            else
                cout<<"YES"<<endl;
        }
    }
}

C++ 解法, 执行用时: 2ms, 内存消耗: 504KB, 提交时间: 2020-08-22

#include <iostream>

using namespace std;

bool getGold(int s,int n,int d,int x,int y,int t0,int t1,int t2){
    int bingTime = 0;
    int heroATime = 0;
    int heroJTime = 0;
    while(s > 0){
        while(bingTime <= heroATime && bingTime <= heroJTime){
            s -= n*d;
            if (s <= 0){
                return false;
            }
            bingTime += t0;
        }
        while(heroATime < bingTime && heroATime <= heroJTime){
            s -= x;
            heroATime += t2;
            if (s <= 0){
                return true;
            }
        }
        while(heroJTime < bingTime && heroJTime <= heroATime){
            s -= y;
            heroJTime += t1;
            if (s <= 0){
                return true;
            }
        }
    }
    
    
    return false;
}
int main(){
    int T;
    int s;
    int n,d,x,y;
    int t0,t1,t2;
    cin >> T;
    for(int i = 0;i<T;i++){
    cin >> s;
    cin >> n;
    cin >> d;
    cin >> x;
    cin >> y;
    cin >> t0;
    cin >> t1;
    cin >> t2;
    bool can = getGold(s,n,d,x,y,t0,t1,t2);
        if (can){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }
    return 0;
}

上一题