NOIP2016 提高组 复赛 day1 toy 玩具谜题

NOIP2016 提高组 复赛 day1 toy 玩具谜题

1.读了题目,给绕晕了,什么朝里,朝内,左边右边,没心思手动模拟,但题意是看明白了,模拟准备交给程序。

2.因每个玩具有两个信息,朝向,职业名称,第一构想就是用结构体来描述玩具。

3.看到样例1就没往下看,没找到n的范围,直接数组开到10^6,测试完样例2,才发现下面给出了n的范围,题目一定要看看完啊,题中n的范围10^5,还好,本人开得够大。

4.程序的核心设置了变量cur用来保存当前的玩具在数组中的位置。

5.在处理朝内朝外,左边右边时,采用了函数的做法,否者在if,else里的代码量太大了。引入了clockwise(),anticlockwise()两个函数,大大减轻了代码输入量,比较清楚的理清了逻辑关系。

6.处理移动玩具时,采用取模的方式,逆时针cur=(cur+move)%n;;顺时针cur=(cur-move+n)%n;。此处处理手法请读者多多掌握,很是有用(NOIP2012 提高组 复赛 day1 vigenere)里就有涉及,详见http://blog.csdn.net/mrcrack/article/details/52303717

7.样例1,样例2通过后,提交AC。

耗时:30分钟

难度:简单偏中等

附上AC代码,编译环境Dev-C++4.9.9.2:

//2016 toy 2016-12-30
#include <stdio.h>
struct people{
    int direction;
    char prof[20];
}p[1000000];
int cur,dir,move;
int n;
void clockwise(){
    cur=(cur-move+n)%n;
}
void anticlockwise(){
    cur=(cur+move)%n;
}
int main(){
    int m;
    int i,j;
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++){
        scanf("%d%s",&p[i].direction,&p[i].prof);
    }
    cur=0;
    for(i=0;i<m;i++){
        scanf("%d%d",&dir,&move);
        if(p[cur].direction==0){//当前朝内
            if(dir==0){
                clockwise();
            }else{
                anticlockwise();
            }
        }else{//当前朝外
            if(dir==1){
                clockwise();
            }else{
                anticlockwise();
            }
        }
    }
    printf("%s\n",p[cur].prof);
    return 0;
}

2016-12-30 20:57


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值