ACdream 1073 雷霆战机

分析

题目长,理一理。

Lv1 ---A---> Lv25 ---B---> Lv30 ---C---> Lv60 ---D---> Lv75

需要完成的是从Lv1走向Lv75。这里选取A、B、C、D为主体,选取足够的经验球填充(或者选取当前经验为主体,每进一阶,将经验置为该阶的最低值,因为经验禁止溢出,也是因为这样所以放弃了这种考虑方式)。

也就是说,需要挑选经验球来填A、B、C、D这四个经验池。
如何选取经验球?根据题目的提示,选择方案如下。

a)选取一个当前未使用的,能填满经验池,且经验值最小的经验球;
b)如果没有满足上述的经验球,则选取一个当前未使用的、经验值最大的经验球,重复a)。

根据这个方案,于是有了如下代码(仍可改进)。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX_N 1005
using std::sort;

int N, D[4], EXP[MAX_N];
bool used[MAX_N];

void solve()
{
    sort(EXP, EXP+N);
    memset(used, false, sizeof(used));
    int i, j, pass = 0;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < N; j++)
            if (!used[j] && EXP[j] >= D[i]) { used[j] = true; pass++; break; }
        if (j == N)
            for (j = N-1; j >= 0; j--)
                if (!used[j]) { used[j] = true; D[i] -= EXP[j]; i--; break; }
    }
    if (pass != 4) printf("NO\n");
    else {
        for (i = 0, j = 0; j < N; j++) if (!used[j]) i += EXP[j];
        printf("YES %d\n", i);
    }
}

int main()
{
    while (~scanf("%d", &N)) {
        for (int i = 0; i < 4; i++) scanf("%d", &D[i]);
        for (int i = 0; i < N; i++) scanf("%d", &EXP[i]);
        solve();
    }
    return 0;
}

题目

Description

风风最近迷上了一个打飞机游戏——《雷霆战机》,战机分为白二星、绿三星、蓝四星、紫五星,四种品质。当然,最厉害的是紫色五星的战机啦。

战机分为升级和进阶两种。
升级:提升战机的等级,但战机品质不变。
进阶:可将战机提升一个星级(白二星->绿三星->蓝四星->紫五星)。

为了简化问题,规定战机进阶规则如下:

白色二星

起始等级Lv1级,满级Lv25级。
Lv1升级到Lv25,总共需要A经验。
进阶到绿色三星条件:满级Lv25后,方可进阶。

绿色三星

起始等级Lv25级,满级Lv30级。
Lv25升级到Lv30,总共需要B经验。
进阶到蓝色四星条件:满级Lv30后,方可进阶。

蓝色四星

起始等级Lv30级,满级Lv60级。
Lv30升级到Lv60,总共需要C经验。
进阶到紫色五星条件:满级Lv60后,方可进阶。

紫色五星

起始等级Lv60级,满级Lv75级。
Lv60升级到Lv75,总共需要D经验。
满级LV75后,最强战机诞生!

现在风风手上有1架Lv1级的白二星,和N个经验球(可以升级战机的球球~~~),每个经验球都有一定的经验值。
每次风风都只能使用一个经验球给战机升级,并且每个经验球只能用一次后就会消失。
另外,风风有个习惯。就是每次都会优先选择能将战机升级到相应星级对应的满等级的最小的经验球。若剩下的经验球中最大的经验球也不能将现在的战机升到满级,那么风风就会选择这些剩下的经验球里面经验值最大的那个经验球对战机进行升级了。
如果按照风风的方式对战机进行升级进阶,风风能否成功将自己的战机升级到满级LV75的紫色战机呢?
如果能,请告诉风风,他最后剩下的未被使用的经验球的经验总和是多少?

注意:如果使用某个经验球使战机升级到满级了,那么多出的经验是不会累积的,这时候你需要对战机进阶到下一个品质,提升满级的等级。才可以继续升级。
例如:

现在有一架绿色三星Lv29的战机,还需要80的经验可以升级到满级Lv30。如果你使用了经验为9999的经验球。只能将战机升级到满级Lv30,而不会升级到Lv31级以上,经验值不会累积。因为在使用经验球的同时,无法进行进阶。因为进阶需要满级后,才可以进阶。

另外,值得一提的是:如果是一架绿色三星Lv9的战机,还需要10的经验升级到Lv10,而Lv10到Lv11需要15点经验,Lv11到Lv12需要22点经验。那么你使用经验值为30的经验球,可以将战机直接升级到Lv11,并且还需要17点经验升级到Lv12。(也就是说还未达到满级的战机,使用经验球可以跨级升级,而满级后,需要进阶到下一个品质,才可以继续升级)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值