【题解】[NOIP2016]玩具谜题

news2024/11/24 22:48:29

题目描述

P1563 [NOIP2016 提高组] 玩具谜题

前置知识

题目分析

题目比较绕,关键是要搞清楚顺时针、逆时针和左、右,把每个指令转换为数组下标的移动。

首先提取出关键信息:

输入顺序为逆时针
面朝圈内:左->顺时针,右->逆时针
面朝圈外:左->逆时针,右->顺时针

判断每一步移动的步骤:
取得指令方向 → 取得当前朝向 → 得出下标变化方向

关键是最后一步,需要分情况讨论。对于分类讨论,列表分析是最合适的方法。
表 分类讨论

另附示例 1 的分析图:
表 示例1

至于怎么模拟这个“圈”,可以使用取余运算实现。
具体见代码。

参考答案

Java:

import java.util.*;

class Person {
	public final static int OUTER = 0; // 圈内
	public final static int INNER = 1; // 圈外

	public int direction;
	public String name;

	@Override
	public String toString() {
		return name + " " + direction;
	}
}

class Command {
	public final static int LEFT = 0;
	public final static int RIGHT = 1;

	public int direction;
	public int step;

	@Override
	public String toString() {
		return direction + " " + step;
	}
}

public class Main {
	private static ArrayList<Person> persons = new ArrayList<Person>();
	private static ArrayList<Command> commands = new ArrayList<Command>();

	public static void main(String[] args) {
		// 输入
		Scanner s = new Scanner(System.in);
		int n = 0; // 小人个数
		int m = 0; // 指令个数
		n = Integer.parseInt(s.next());
		m = Integer.parseInt(s.next());
		// 输入小人
		for (int i = 0; i < n; i++) {
			Person p = new Person();
			p.direction = Integer.parseInt(s.next());
			p.name = s.next();
			persons.add(p);
		}
		// 输入指令
		for (int i = 0; i < m; i++) {
			Command c = new Command();
			c.direction = Integer.parseInt(s.next());
			c.step = Integer.parseInt(s.next());	
			commands.add(c);
		}

//		System.out.println("Person: " + persons);
//		System.out.println("Command: " + commands);
		
		// 求解
		System.out.println(solve());
	}
	
	private static String solve() {
		int index = 0;
		
		// 题目分析部分提到的表的代码实现
		for (Command c : commands) {
			Person p = persons.get(index);
			if (c.direction == Command.LEFT) {
				if (p.direction == Person.OUTER)
					index -= c.step;
				else
					index += c.step;
			}
			else {
				if (p.direction == Person.OUTER)
					index += c.step;
				else
					index -= c.step;
			}
			// 实现下标循环
			index = (index + persons.size()) % persons.size();
		}
		
		return persons.get(index).name;
	}
}

C++:
(由 ChatGPT 转换)

#include <iostream>
#include <vector>
#include <string>

class Person {
public:
    static const int OUTER = 0; // 圈内
    static const int INNER = 1; // 圈外

    int direction;
    std::string name;
};

class Command {
public:
    static const int LEFT = 0;
    static const int RIGHT = 1;

    int direction;
    int step;
};

int main() {
    std::vector<Person> persons;
    std::vector<Command> commands;

    // 输入
    int n, m;
    std::cin >> n >> m;

    // 输入小人
    for (int i = 0; i < n; i++) {
        Person p;
        std::cin >> p.direction >> p.name;
        persons.push_back(p);
    }

    // 输入指令
    for (int i = 0; i < m; i++) {
        Command c;
        std::cin >> c.direction >> c.step;
        commands.push_back(c);
    }

    // 求解
    std::cout << solve(persons, commands) << std::endl;

    return 0;
}

std::string solve(std::vector<Person>& persons, std::vector<Command>& commands) {
    int index = 0;

    for (const Command& c : commands) {
        Person& p = persons[index];
        if (c.direction == Command::LEFT) {
            if (p.direction == Person::OUTER)
                index -= c.step;
            else
                index += c.step;
        }
        else {
            if (p.direction == Person::OUTER)
                index += c.step;
            else
                index -= c.step;
        }
        // 实现下标循环
        index = (index + persons.size()) % persons.size();
    }

    return persons[index].name;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1097854.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVASSMMYSQL高校学生选课系统01483-计算机毕业设计项目选题推荐(附源码)

目 录 摘要 1 绪论 1.1 研究背景 1.2开发意义 1.3ssm框架 1.4论文结构与章节安排 2 2 高校学生选课系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1功能性分析 2.3.2非功能性分析…

哪个文字转语音配音软件最好用?

现在TTS技术不断发展&#xff0c;文字转语音技术已经越来越成熟&#xff0c;声音听着拟人度非常高&#xff0c;现在好用的软件也不在少数。很多手机里面都有自带的朗读功能&#xff0c;如果觉得声音不够&#xff0c;也可以自己下载软件使用。给大家分享一下我一直使用的一款文字…

全志R128 BLE最高吞吐量测试正确配置测试

在R128使用前我们需要了解BLE的最高吞吐量&#xff0c;以方便评估相关功能的开发。 首先我们了解一下哪些因素会影响蓝牙的吞吐量&#xff1a; 1、蓝牙版本与PHY&#xff1a; 蓝牙设备的版本和物理层&#xff08;PHY&#xff09;对于吞吐量有很大影响。例如&#xff0c;R128设…

基于Python的车牌识别系统实现

本文将以基于Python的车牌识别系统实现为方向&#xff0c;介绍车牌识别技术的基本原理、常用算法和方法&#xff0c;并详细讲解如何利用Python语言实现一个完整的车牌识别系统。 目录 引言车牌识别技术的应用场景Python在车牌识别领域的优势 车牌识别技术概述图像处理和计算机视…

《软件方法》第1章2023版连载(07)UML的历史和现状

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 1.3 统一建模语言UML 1.3.1 UML的历史和现状 上一节阐述了A→B→C→D的推导是不可避免的&#xff0c;但具体如何推导&#xff0c;有各种不同的做法&#xff0c;这些做法可以称为“方…

正点原子嵌入式linux驱动开发——新字符设备驱动实验

经过之前两篇笔记的实战操作&#xff0c;已经掌握了Linux字符设备驱动开发的基本步骤&#xff0c;字符设备驱动开发重点是使用register_chrdev函数注册字符设备&#xff0c;当不再使用设备的时候就使用unregister_chrdev函数注销字符设备&#xff0c;驱动模块加载成功以后还需要…

广义回归神经网络预测程序

欢迎关注“电击小子程高兴的MATLAB小屋” %% 学习目标:广义回归神经网络 %% 训练速度快 非线性映射能力强 常用于函数逼近 clear all; close all; P1:30; T3*sin(P); netnewgrnn(P,T,0.3); %径向基函数的分布密度是0.3 ysim(net,P); figure; plot(P,T,:,P,T-y,-o);

GitHub下载量从19暴涨到5W,这份架构师学习路线只用了一晚

技术人P8什么概念&#xff1f; 正常本科校招进阿里&#xff0c;6年以下别想P8&#xff0c;普通社招进入阿里&#xff0c;30岁以下P8几乎没有&#xff0c;P8不仅仅是个人技术能力强&#xff0c;还有要有撑起整个团队的能力&#xff1b; 这位大佬在阿里已经工作了8年&#xff0…

zabbix部署与监控

目录 一、什么是zabbix&#xff1f; 二、zabbix 监控原理 三、Zabbix 新特性 三、Zabbix 功能组件 四、部署 zabbix zabbix的服务端部署 zabbix的客户端部署 zabbix的服务端部署 一、什么是zabbix&#xff1f; zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络…

51单片机点阵

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、点阵是什么&#xff1f;1.点阵的原理2. 3*3 点阵显示原理3. 8*8点阵实物图4. 8*8点阵内部原理图5. 16*16点阵实物图&#xff0c;显示原理 二、使用步骤1.先…

【C++从0到王者】第三十八站:位图和布隆过滤器

文章目录 一、哈希桶的改进1.链表与树结构的结合2.扩容使用质数 二、位图1.位图的概念2.位图的实现3.位图的其他应用 三、布隆过滤器1.布隆过滤器的提出2.布隆过滤器的实现3.布隆过滤器的应用 一、哈希桶的改进 1.链表与树结构的结合 有时候&#xff0c;在极端场景下&#xf…

一本由红帽专家亲作的Quarkus实战型入门书籍——《Kubernetes原生微服务开发》

Kubernetes原生微服务开发 出版社&#xff1a; 清华大学出版社 作者&#xff1a;[美] 约翰克林甘&#xff08;John Clingan&#xff09;、肯芬尼根(Ken Finnigan) 出版时间&#xff1a;2023年6月 微服务开发并不容易。其中涉及大量的概念与复杂的技术&#xff0c;令很多开发者…

ARP协议(地址解析协议) 的作用和操作过程

目录 1.问题: &#xff08;在同一个LAN局域网内&#xff09;如何在已知目的接口的IP地址前提下确定其MAC地址&#xff1f;2.问题&#xff1a;现在假设主机A要向目的主机B发送一个数据报&#xff0c;怎么发送呢&#xff1f;2.1在一个局域网内时2.1.1情况一&#xff1a;2.1.2情况…

从基础到卷积神经网络(第15天)

1. PyTorch 神经网络基础 1.1 模型构造 1. 块和层 首先,回顾一下多层感知机 import torch from torch import nn from torch.nn import functional as Fnet = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))X = torch.rand(2, 20) # 生成随机输入(批…

年龄越大,越要小心逢九年

老话有云&#xff1a;年龄逢九&#xff0c;灾祸频有。在我国的许多农村地区&#xff0c;至今还流传着这么句话&#xff0c;这句话的大概意思是说&#xff1a;每个人命理年龄逢九&#xff0c;就会有个坎&#xff0c;年龄越大&#xff0c;坎就越厉害&#xff0c;所以&#xff0c;…

【真题T1】[NOIP2022] 种花

一.题目 P8865 [NOIP2022] 种花 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 二.思路&#xff08;80pts&#xff09; &#xff08;1&#xff09;"C"型 则我们可以计算出每一行的前缀和&#xff0c;然后枚举每一列再每枚举每一行&#xff0c;定义为x1&#xff1b…

算法leetcode|84. 柱状图中最大的矩形(rust重拳出击)

文章目录 84. 柱状图中最大的矩形&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 84. 柱状图中最大的矩形&#xff1a; 给定 n 个非负整…

配置文件-依赖注入

文章目录 前言一、如何解决注入依赖顺序&#xff1f;二、不生效的到问题三 解决办法总结 前言 spring注入bean的时候,可以指定某些注入顺序 例如&#xff1a;A B两个bean注入,B依赖A ,所以要先注入A 然后才能注入B,此时如何处理呢? 一、如何解决注入依赖顺序&#xff1f; 通…

pdf怎么压缩?pdf文件过大这样压缩准没错

在日常生活中&#xff0c;我们常常需要处理大量的PDF文件&#xff0c;这些文件不仅占用存储空间&#xff0c;而且在传输时也可能会受阻&#xff0c;为了解决这些问题&#xff0c;我们需要对PDF文件进行压缩&#xff0c;下面就给大家分享几个PDF压缩方法&#xff0c;一起来看看吧…

【Python数据挖掘】自动售货机销售数据分析与应用【送书活动】

目录 前言01 案例背景02 分析目标03 分析过程04数据预处理1.清洗数据1.1 合并订单表并处理缺失值1.2 增加“市”属性1.3 处理订单表中的“商品详情”属性1.4 处理“总金额&#xff08;元&#xff09;”属性 2.属性选择3.属性规约 05销售数据可视化分析1.销售额和自动售货机数量…