luogu IBvl战队的膜你赛 T1 T54724 空间复杂度
请注意,丢失的血量最少为0,即如果丢失的血量小于10时,使用生命药水会使丢失的生命变成0
请注意,我们所求的是勇士丢失的HP。
因为数据出锅,没有$M$的点只有一个。现调整测试点分数,将该点改为20分。请重新提交。我们对因此带来的不便感到十分抱歉qwq
请注意,初始点为空,您不需要特判初始点。
题目描述
我们的勇者已经来到地下城的入口,做好准备。
然而城主突然发现他地下城中的监测魔法阵坏了!现在他只能知道我们的勇者到了哪里。
他的监测魔法阵若要调试好需要时间,但是他还需要去给勇者找战利品。
他想知道勇者现在到了哪里,以便规划时间;还想知道勇者的属性,以便知道穿什么样的盔甲才不会被打痛。
他希望你帮助他。他将给你地下城的地图与每次勇者的行动,并询问你当前勇者的属性。
如果你成功回答他每一个问题,他将会把你此次任务的分数给予你。
详细介绍 说人话:
给你$n \times m$的地图,地图上有如下几种元素:
- $.$,表示此处可以通过,且无其他元素;
- $R$,表示此处为生命药水,可以减少勇者$10$点丢失的$HP$(血量);
- $Q$,表示此处为力量药水,可以增加勇者$5~STR$(攻击力);
- $Y$,表示此处为防御药水,可以增加勇者$5~DEF$(防御力);
- $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$次操作:
- $M~~W/E/N/S$,表示勇者移动的方向(左/右/上/下);
- $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$,输出换行。
输入输出样例
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
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;
}