原题见洛谷(https://www.luogu.org/problem/show?pid=1563)
这道题是一道很裸的模拟题,在noip的day1t1理论上是最简单的一道题,而且数据范围在100000,基本上纯暴力直接就过了而且1s/128MB的空间限制也不是小了,题目中虽然玩具有左右,寻找的方向也有左右,看起来有四种结果但是我们在进行分析后发现,不过只有两种情况:向左走和向右走,分析如下:
玩具(1) 方向(1) 向左
玩具(0) 方向(1) 向右
玩具(1) 方向(0) 向右
玩具(0) 方向(0) 向左
不过是这两种情况
那么我们用head来表示现在所指向的玩具way来表示所发出指令的方向,ans来表示要向当前方向前进的步数,定义一个结构体node其中包含玩具朝向的方向和玩具的名称之后呢如果head所指向的玩具所指的方向和是同一个方向那么讲head减去ans再加上n并对这个数取余,这里加n是为了防止对负数取余,如果要走的方向和玩具朝向的方向不一致那么将head加上ans并对这个数取余即可,那么最后得到的head就是我们要的了,最后将head所指的名字输出即可
下面是AC代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
struct node{
bool dir;
char name[20];
}toy[100000];
int n,m;
int head=0;
int way,ans;
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
cin>>toy[i].dir>>toy[i].name;
}
for(int i=0;i<m;i++){
scanf("%d%d",&way,&ans);
if(toy[head].dir==way){
head=((head-ans)+n)%n;
}
else{
head=(head+ans)%n;
}
}
printf("%s",toy[head].name);
return 0;
}
然后呢我自洛谷上学到了快速输入输出,大概时间有我原来评测的总时间332ms优化到151ms要比原来块一倍
贴代码
inline int read(){
register int x=0;bool f=1;
register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return f?x:-x;
}