luogu IBvl战队的膜你赛 T1 T54724 空间复杂度

请注意,丢失的血量最少为0,即如果丢失的血量小于10时,使用生命药水会使丢失的生命变成0

请注意,我们所求的是勇士丢失的HP。

因为数据出锅,没有$M$的点只有一个。现调整测试点分数,将该点改为20分。请重新提交。我们对因此带来的不便感到十分抱歉qwq

请注意,初始点为空,您不需要特判初始点。

题目描述

我们的勇者已经来到地下城的入口,做好准备。

然而城主突然发现他地下城中的监测魔法阵坏了!现在他只能知道我们的勇者到了哪里。

他的监测魔法阵若要调试好需要时间,但是他还需要去给勇者找战利品。

他想知道勇者现在到了哪里,以便规划时间;还想知道勇者的属性,以便知道穿什么样的盔甲才不会被打痛

他希望你帮助他。他将给你地下城的地图与每次勇者的行动,并询问你当前勇者的属性。

如果你成功回答他每一个问题,他将会把你此次任务的分数给予你。

详细介绍 说人话:

给你$n \times m$的地图,地图上有如下几种元素:

  1. $.$,表示此处可以通过,且无其他元素;
  2. $R$,表示此处为生命药水,可以减少勇者$10$点丢失的$HP$(血量);
  3. $Q$,表示此处为力量药水,可以增加勇者$5~STR$(攻击力);
  4. $Y$,表示此处为防御药水,可以增加勇者$5~DEF$(防御力);
  5. $M$,表示此处为怪物。为了降低验题人工作量题目难度,所有怪物属性相同。

与怪物的遭遇

一旦走到怪物格,遭遇战将开始。

怪物对勇者造成的伤害为$\max(1,~\left \lceil \dfrac{HP_{enemy}}{\max(1, STR_{hero} - DEF_{enemy})} \right \rceil \times \max(1, STR_{enemy} - DEF_{hero}))$。

给出$q$,有$q$次操作:

  1. $M~~W/E/N/S$,表示勇者移动的方向(左/右/上/下);
  2. $Q$,表示询问。询问要求输出勇者丢失的$HP$与当前的$~STR,~DEF$。

输入输出格式

输入格式:

第一行,两个整数,$n$和$m$;

以下$n$行,每行$m$个字符,为地图;

以下一行,三个整数$a,~b,~c$,分别表示怪物的$HP$,$STR$与$DEF$;

以下一行,两个整数$x,~y$,表示勇者开始冒险位置的行与列;

以下一行,两个整数$d,~e$,表示勇者的初始$STR$与$DEF$;

以下一行,一个整数,$q$;

以下$q$行,给出$q$次操作。

输出格式:

对于每个$Q$,输出$HP~STR~DEF$,输出换行。

输入输出样例

输入样例#1: 复制
5 5
MMMMM
RRRRR
QQQQQ
YYYYY
.....
5 5 5
5 1
10 10
8
M N
Q
M N
M N
M N
Q
M E
Q
输出样例#1: 复制
0 10 15
1 15 15
2 15 15

说明

对于$100\%$数据,$1 \leqslant n,~m \leqslant 100$,$1 \leqslant q \leqslant 10000$。

对于其中$20\%$的数据,保证地图中不存在$M$。

保证输入数据及勇士属性在$32$位带符号整型范围内。

规定最上方一行为第一行,最左边一列为第一列。

保证初始位置为空。保证勇士移动合法。

我们认为药水可以多次使用,怪物在下次勇者到来前会派遣增援。

请注意数据为$\mathcal{Windows}$下制造。

 一道模拟题,但里面有一个点:就是向上取整,这是我第一次碰到向上取整的情况,用ceil()函数,里面的数要用double类型,但里面又有需要用到max()函数,max()函数取得的值又不是double类型,所以手写取最大值的函数。感觉在delhp即所损失的血量,只计算损失值,还是一个比较好的想法。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
inline int read(){
	int x = 0;int f = 1;char c = getchar();
	while(c<'0'||c>'9'){
		if(c == '-')f = -f;
		c = getchar();
	}
	while(c<='9'&&c>='0'){
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x*f;
}
int n,m,hp,delhp,str,def,sx,sy,d,e,q;
char pic[200][200];
double max(int a,int b){
	return a>b?a:b;
}
void check(){
	if(pic[sx][sy] == '.')return;
	if(pic[sx][sy] == 'R'){
	    delhp = max(delhp - 10,0);
		return;
	}
	if(pic[sx][sy] == 'Q'){
		d += 5;
		return;
	}
	if(pic[sx][sy] == 'Y'){
		e += 5;
        return;
	}
	if(pic[sx][sy] == 'M'){
		delhp += max(1,(ceil((double)(hp/max(1,d - def))))) * max(1,str - e);
	     return;
	}
}
int main(){
	n = read(); m = read();
	for(int i = 1; i<=n; ++i){
		for(int j = 1; j<=m; j++){
			cin >> pic[i][j];
		}
	}
	hp = read(); str = read(); def = read();
	sx = read(); sy = read();
	d = read(); e = read();
	q = read();
	for(int i = 1; i<=q; i++){
		char opt,op;
		cin >> op;
		if(op == 'M'){
			cin >> opt;
		if(opt == 'W'){
			sy--;
			check();
		}
	    else if(opt == 'E'){
	    	sy++;
	    	check();
	    }
	    else if(opt == 'N'){
	    	sx --;
	    	check();
	    }
	    else if(opt == 'S'){
	    	sx++;
	    	check();
	    }
	}
	else {
		printf("%d %d %d\n",delhp,d,e);
	}
	}
	
	return 0;
}

posted @ 2018-11-05 17:08  Euplectella  阅读(197)  评论(0编辑  收藏  举报