NOIP 2018模拟赛() 2018 11 3 Day1 T1
T1 铃仙的红色之瞳(eyes)
题目描述
为了方便你的预测,铃仙对该符卡进行了改造。
敌方非常强大,可以看作有无限的体力。通过该符卡,铃仙可以释放出子弹,敌方触碰到子弹就会损失一格体力。注意,每次敌方损失体力之后,其位置不会改变。
当敌方和铃仙 x 坐标相同上时,每秒铃仙损失一点体力(敌方的攻击比较特殊,可以对前后都进行攻击)。注意,这里的秒指的是时间间隔,即第 A 秒时候敌方开始与铃仙处于一条直线上,第 B 秒时候敌方离开这条直线,那么铃仙受到的伤害是(B-A)点。特殊地,如果刚开始铃仙就和敌方在一条直线上,则第 0 秒~第 1 秒也受到一点伤害。若最后铃仙和敌方在 x 坐标相同的位置或者敌方处于有子弹的位置上时,它们只会在第 Q-1 秒到第 Q 秒时受到伤害,并不会在第 Q 秒到第 Q+1 秒受到伤害。
地图是一个 n*m 的矩形,分别对应的 x 坐标为[1,n],y 坐标为[1,m],给定敌方的初始位置和铃仙的位置(铃仙不会移动),当铃仙发出的子弹超过边界时子弹消失,当敌方越过边界时敌方自动回到初始位置。
现在有 Q 秒,每秒一次操作,可能是铃仙的操作也可能是敌方的操作,可能存在的操作如下:
Ins x y 铃仙在(x,y)处召唤了一颗子弹(如果原先就有子弹则该操作无效)
Del x y 铃仙收回法力,让(x,y)处的子弹消失(如果原先没有子弹则该操作无效)
MA U 铃仙将所有子弹上移一格
MA D 铃仙将所有子弹下移一格
MA L 铃仙将所有子弹左移一格
MA R 铃仙将所有子弹右移一格
MB U 敌方上移一格
MB D 敌方下移一格
MB L 敌方左移一格
MB R 敌方右移一格
现在要你计算 Q 秒后敌方损失的体力和铃仙损失的体力。
(注:左移指的是横坐标-1,下移指的是纵坐标-1)
n,m<=100,Q<=1000
题解:模拟!!!
时间复杂度:O(能过)
我居然考场上只有40分,后来发现,我在转移的时候竟然在逐层向下修改,最后把子弹都踢出了地图,555.。
chs表示 跪在评测机前...
代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#define ll long long
#define N 105
using namespace std;
int sho[N][N];
ll ansa,ansb;
char str[10];
int zyy[N][N]; //这个数组一定要开,不然就把子弹转移没了!!!
int main()
{
freopen("eyes.in","r",stdin);
freopen("eyes.out","w",stdout);
int Case;
scanf("%d",&Case);
int n,m;
scanf("%d%d",&n,&m);
int ax,ay,bx,by,bxx,byy;
scanf("%d%d%d%d",&ax,&ay,&bx,&by);
bxx=bx,byy=by;
int Q;
scanf("%d",&Q);
while(Q--)
{
memset(zyy,0,sizeof(zyy));
scanf("%s",str+1);
if(ax==bx) ansa++;
if(sho[bx][by]) ansb++;
if(str[1]=='I')
{
int x,y;
scanf("%d%d",&x,&y);
if(x<1||y<1||x>n||y>m) {}
else sho[x][y]=1;
}else if(str[1]=='D')
{
int x,y;
scanf("%d%d",&x,&y);
if(x<1||y<1||x>n||y>m) {}
else sho[x][y]=0;
}else if(str[1]=='M')
{
if(str[2]=='A')
{
scanf("%s",str+1);
if(str[1]=='U')
{
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
if(sho[i][j])
{
//sho[i][j]=0;
if(j+1<=m) zyy[i][j+1]=1;
}
}
}
}else if(str[1]=='D')
{
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
if(sho[i][j])
{
//sho[i][j]=0;
if(j-1>0) zyy[i][j-1]=1;
}
}
}
}else if(str[1]=='L')
{
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
if(sho[i][j])
{
//sho[i][j]=0;
if(i-1>0) zyy[i-1][j]=1;
}
}
}
}else if(str[1]=='R')
{
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
if(sho[i][j])
{
/// sho[i][j]=0;
if(i+1<=n) zyy[i+1][j]=1;
}
}
}
}
//memset(zyy,0,sizeof(zyy));
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
sho[i][j]=zyy[i][j];
}
}
}else if(str[2]=='B')
{
scanf("%s",str+1);
if(str[1]=='U')
{
by++;
}else if(str[1]=='D')
{
by--;
}else if(str[1]=='L')
{
bx--;
}else if(str[1]=='R')
{
bx++;
}
if(bx<1||by<1||bx>n||by>m) bx=bxx,by=byy;
}
}
}
printf("%I64d\n%I64d\n",ansb,ansa);
return 0 ;
}
/*
1
5 5
2 2
2 5
3
Ins 2 5
MA D
Del 2 4
*/
下一篇: 约瑟夫优化