反正考的不是很好吧,赶脚炸了啊qwq
然后这两天一直在忙一些神奇的事情,所以没有整理完
手动@water_lift
T1:大美江湖:
【题目背景】
细雪飘落长街,枫叶红透又一年
不只为故友流连,其实我也恋长安
听门外足音慢,依稀见旧时容颜
故事几经悲欢,结局都与你有关
——银临《大美江湖》 【问题描述】
扶苏听着《大美江湖》,在剑三里控制着他的人物炮姐来到了长安。
长安城中有一个任务,需要扶苏进入地下的机关道,机关道是一个 n×m 的矩形地 图,里面有一些怪物和药水。扶苏操控着炮姐在机关道中游荡。有些时候他希望问问你 他的角色有多少攻击力、防御力以及丢失了多少血量。
具体的,在输入文件中会给出一个 n×m 的矩形地图,地图中第 i 行第 j 列的字符 Ci,j 代表机关道中第 i 行第 j 列的元素是什么。具体的,Ci,j∈{‘.’, ‘R’, ‘Q’, ‘Y’, ‘M’}。
其中,
1、字符 . 代表此处可以通过,且无其他元素
2、字符 R 代表此处为生命药水,可以减少炮姐 10 点丢失的血量 HP
3、字符 Q 代表此处为力量药水,可以增加炮姐 5 点攻击力 ST
4、字符 Y 代表此处为防御药水,可以增加炮姐 5 点防御力 DE
5、字符 M 代表此处为怪物,炮姐会损失相应血量
每只怪物都有三个参数来描述他们的属性,分别是血量 HPenemy,攻击力 STenemy,防 御力 DEenemy。且所有怪物的属性都相同。
一旦走到怪物格,遭遇战将开始。扶苏一定会打死怪物,怪物对炮姐造成的伤害为:
(忍不住说这个数据有点水,我看错括号代码锅掉了居然还A了qwq)
其中 max(a,b) 代表取 a 和 b 的最大值;的值为不小于 x 的最小整数;下标为 enemy 的参数代表怪物的参数,下标为 my 的参数代表炮姐的参数 你会收到 q 次操作,每次操作要么是一次查询,要么是一次移动。 对于移动,你会再获得一个数字参数,这个参数只可能是 1/2/3/4 其中的一个,代表 炮姐向地图的 左/右/上/下 移动。
【输入格式】 输入文件名为 mzq.in。
输入文件中有且仅有一组数据,第一行为两个正整数 n 和 m,代表地图的大小
下面 n 行,每行 m 个字符,描述机关道的地图
下面一行有三个正整数,分别代表HPenemy,STenemy,DEenemy
下面一行有两个整数 x, y,代表炮姐初始在 第 x 行第 y 列出发。如果出发点有怪物,不发生战斗,如果有道具,不会将其捡拾。
下面一行给出两个正整数,代表炮姐初始的 ST 和 DE。
下面一行给出一个整数 q,代表操作个数
以下q行,每行首先有一个数字,如果是 1,则代表一次查询。否则数字一定是 2, 代表炮姐的一次移动,一个空格后会给出一个数字,作为移动的参数。
【输出格式】
输出文件名为 mzq.out。 对于每个查询,输出一行三个用空格隔开的整数,代表炮姐损失的血量 HP,当前 的攻击力 ST,以及当前的防御力 DE
【输入样例#1】
5 5
MMMMM
RRRRR
QQQQQ
YYYYY
.....
5 5 5
5 1
10 10
8
2 3
1
2 3
2 3
2 3
1
2 2
1
【输出样例#1】
0 10 15
1 15 15
2 15 15
注意:如果多次进入同一个格子,格子上的药水可以重复拾取,小怪会重复出现
注意:如果在拾取药水的时候人物损失的生命值低于10,则会将损失的生命值降至0
SOLUTION:
这道题其实只要直接模拟就好啦,然后注意到一些细节,注意动态维护伤害就好啦
然后其实自己的代码出锅了,所以各位大兄弟看看代码就好啦。
对了还有ceil不要随便用: 点这里吧
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<bits/stdc++.h> using namespace std; inline int read(){ int ans=0; char last=' ',ch=getchar(); while(ch<'0'||ch>'9') last=ch,ch=getchar(); while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar(); if(last=='-') ans=-ans; return ans; } int n,m,hp,st,de,sh,x,y,stm,dem,q,cz,hps,yd; int dx[5]={0,0,0,-1,1}; int dy[5]={0,-1,1,0,0}; char a[101][101]; int sx(){ int f=max(1,stm-de); int g=hp/f; if(hp%f!=0) g++; int z=max(1,g); int a=max(1,st-dem); int y=z*a; return y; } //%%%zay int main(){ freopen("mzq.in","r",stdin); freopen("mzq.out","w",stdout); n=read();m=read(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) a[i][j]=getchar(); getchar(); } hp=read();st=read();de=read(); x=read();y=read(); stm=read();dem=read(); q=read(); for(int i=1;i<=q;i++){ cz=read(); if(cz==1) cout<<hps<<" "<<stm<<" "<<dem<<endl; else { yd=read(); x+=dx[yd]; y+=dy[yd]; if(a[x][y]=='M'){ hps+=sx(); } if(a[x][y]=='R'){ if(hps<10) hps=0; else hps-=10; } if(a[x][y]=='Q'){ stm+=5; } if(a[x][y]=='Y'){ dem+=5; } if(a[x][y]=='.'){ continue; } } } return 0; }