列表

详情


NC212589. 小波的RPG

描述

小波在玩一款RPG游戏,小波作为一个剑士,有AK点攻击力,HP点生命上限和初始值为0的经验条,他要去击杀各种怪物。一共有n个怪物,每个怪物也有攻击力,生命值,同时还有被击杀时小波可以获得的经验。战斗为回合制,小波先攻击,怪物后攻击。每次攻击,被攻击者的生命值会失去攻击者的攻击力的数值,生命值先归0的一方失败。若胜利者为小波,小波会获得对应经验,若经验条达到10及以上,小波便会升级,恢复其生命至上限,经验条减少10,需要注意的是升级不会改变小波的攻击力与生命上限。在打怪的过程中,挑战怪物的顺序不能改变,但是可以决定是否跳过当前的怪物,直接挑战下一只,若无法战胜怪物,则必须跳过此怪物,被跳过的怪物不能再挑战。请你规划一种方案,使小波的等级在结束后尽可能高,并输出小波的最高等级。

输入描述

第一行三个整形数 表示怪物的数量,小波的攻击力,小波的生命上限。

以下n行,每行三个整形数 分别表示怪物的攻击,生命值,经验值。

输出描述

输出一个整形数,表示小波的等级。

示例1

输入:

5 5 20
9 11 8
3 20 5
9 6 5 
19 6 9
1 11 30

输出:

4

说明:

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 16ms, 内存消耗: 380K, 提交时间: 2020-09-23 21:50:41

#include<bits/stdc++.h>
using namespace std;

struct gw{
    int a,b,c;
}g[100];
int n,ak,hp;
int dg(int p,int hp){
    int t=(g[p].b)/ak;
    if((g[p].b)%ak>0) t++;
    return hp-g[p].a*(t-1);
}
int dfs(int x,int hp,int c){
    int res=0;
    if(x == n+1 ) return 0;
    int h = dg(x,hp);
    if(h>0){
        if(c+g[x].c>=10) h=::hp;
        res = max(dfs(x+1,hp,c),dfs(x+1,h,(c+g[x].c)%10)+(c+g[x].c)/10);
    }
    else res = dfs(x+1,hp,c);
    return res;
}

int main(){
    scanf("%d%d%d",&n,&ak,&hp);
    for(int i=1;i<=n;i++){ scanf("%d%d%d",&g[i].a,&g[i].b,&g[i].c); }
    int ans=dfs(1,hp,0);
    printf("%d\n",ans);
    
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 10ms, 内存消耗: 380K, 提交时间: 2020-09-22 18:56:19

#include<iostream>
using namespace std;
int n,ak,hp,a[2007],b[2007],c[2007];
int cal(int p,int h){
	int time;
	if(b[p]%ak==0){
		time=b[p]/ak;
	}
	else time=b[p]/ak+1;
	return h-(time-1)*a[p];
}
int dfs(int p,int h,int z){
	if(p==n+1)return 0;
	int H=cal(p,h);
	if(H>0){
		if(z+c[p]>=10){
			H=hp;
		}
		return max(dfs(p+1,h,z),dfs(p+1,H,(z+c[p])%10)+(z+c[p])/10);
	}
	else{
		return dfs(p+1,h,z);
	}
}
int main(){
	scanf("%d%d%d",&n,&ak,&hp);
	for(int i=1;i<=n;i++){
		scanf("%d%d%d",&a[i],&b[i],&c[i]);
	}
	printf("%d\n",dfs(1,hp,0));
}

上一题