NOIP2016Day1T1玩具谜题解题报告

来源:互联网 发布:百度云 知乎 编辑:程序博客网 时间:2024/06/05 05:32

原题见洛谷(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;}