NOIP2016Day1T1玩具谜题解题报告

原题见洛谷(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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值