ACdream 1073 雷霆战机
2015-08-09 22:54
211 查看
分析
题目长,理一理。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。(也就是说还未达到满级的战机,使用经验球可以跨级升级,而满级后,需要进阶到下一个品质,才可以继续升级)。
相关文章推荐
- Codeforces Round #105 (Div. 2) (ABCDE题解)
- Django进阶
- 字符串反转
- HDU 3016 Man Down(线段树 + DP)
- python2.x与3.x除法的区别
- ExtJS要利用观察者模式 去实现自定义的事件
- QQ好友列表很炫?其实很简单!
- 高斯消元小结(贴一些模板)
- android引导页的实现
- 第5章
- 我们为什么要使用补码?
- 课后作业07--二分法查找算法代码
- 文件写入或控制台输出显示:"烫烫烫烫"问题解决办法
- 论文注解《Query Languages for Graph Databases》graph数据库查询语法(III)
- mac上安装android studio出现Error:compileSdkVersion android-x requires compiling with JDK 7问题
- java处理高并发高负载的网站的优化方法
- 2维,3维向量单位化
- 关于动态链接库的接口
- (4.1.28.3)第二种方法HttpClient.setCookieStore(mCookieStore)实现的HTTP工具类
- Struts2中的ModelDriven机制及其运用