[NOIP2016 提高组] 玩具谜题 解题思路及代码

先贴个题目:

 以及题目里链接:P1563 [NOIP2016 提高组] 玩具谜题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1563

然后是我的代码 :

#include<iostream>
#include<cstring>
using namespace std;
struct member{	//将朝向和名字合成一个结构体 
	int x;
	string name;
};
struct command{	//存命令集 
	int side;
	int num;
};
int main()
{
	int n,m;
	int y=0;	//所在人的下标初始值为0 
	cin>>n>>m;
	member *list1=new member[n];
	command *command1=new command[m];
	for(int i=0;i<n;++i)	//读入序列 
		cin>>list1[i].x>>list1[i].name;
	for(int j=0;j<m;++j)	//读入命令集 
		cin>> command1[j].side>>command1[j].num;
	for(int k=0;k<m;++k){	//执行命令集 
		if(command1[k].side==0){	//判断向左还是向右 
			if(list1[y].x==0){	//判断面朝方向 
				y-=command1[k].num;
				if(y<0)
					y=n+y;
			}
			else{
				y+=command1[k].num;
				if(y>=n)
					y=y-n;
			}
		}
		else{
			if(list1[y].x==0){
				y+=command1[k].num;
				if(y>=n)
					y=y-n;
			}
			else{
				y-=command1[k].num;
				if(y<0)
					y=n+y;
			}
		}
	}
	cout<<list1[y].name;
    delete []list1;	//释放内存 
	return 0;
}

总结下这题:暴力解就行时间复杂度为O(n)不会令人难以接受。(第一次尝试动态内存分配,今天刚学就用上了,还是很有成就感的)思维难点我觉得主要有三个:1.用数组下标替代每个人(也就是给每个人编号)。

2.下标的加或减由朝向和向左向右的两个因素同时决定。

3.因为是一圈人,所以涉及到头尾相接的问题,在这一部分我的灵感来源是int类型的数据储存模式,参考溢出的原理写的下标处理,还挺好用的(bushi)

总体上来讲思维难度不高,把题目理解了就问题不大。

by————2023.11.6刷题记录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值