先贴个题目:
以及题目里链接:P1563 [NOIP2016 提高组] 玩具谜题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://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刷题记录