专栏文章

题解:P1563 [NOIP2016 提高组] 玩具谜题

P1563题解参与者 2已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@miqk4bwm
此快照首次捕获于
2025/12/04 06:06
3 个月前
此快照最后确认于
2025/12/04 06:06
3 个月前
查看原文

题意

依次给你 nn 个围成一圈的人的内外方向及其名字,有 mm 条信息。
11 号人数起,依次执行每条信息中按上一条信息结束的人的方向往左或右数 sis_i 个人,左时方向 ai=0a_i=0,右时方向 ai=1a_i=1
输出执行完最后一条信息后数到的人的名字。

解题分析

明显应该使用 模拟 算法来模拟数人的过程。
根据每条信息给的数的方向,和小人的朝向,分如下四种情况:
  • ai=0a_i=0,朝向为内,顺时针数。
  • ai=1a_i=1,朝向为内,逆时针数。
  • ai=0a_i=0,朝向为外,顺时针数。
  • ai=1a_i=1,朝向为外,逆时针数。
顺时针时位数减 sis_i,逆时针时位数加 sis_i
溢出后检查并补一下 nn 就可以了。

代码

CPP
#include<bits/stdc++.h>
using namespace std;
struct node{
	int x;
	string s;
}man[100005];
int n,m,now=1,k,p;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>man[i].x>>man[i].s;
	for(int i=1;i<=m;i++){
		cin>>k>>p;
		if(!k)p=-p;
		if(man[now].x==1)p=-p;
		now+=p;
		if(now>n)now-=n;
		if(now<=0)now+=n;
	}
	cout<<man[now].s;
	return 0;
}

评论

2 条评论,欢迎与作者交流。

正在加载评论...