[NOIP2004 普及组] 火星人
传送锚点:https://www.luogu.com.cn/problem/P1088
题目描述
人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小的数字加到这个大数上面,把结果告诉火星人,作为人类的回答。
火星人用一种非常简单的方式来表示数字――掰手指。火星人只有一只手,但这只手上有成千上万的手指,这些手指排成一列,分别编号为 \(1,2,3,\cdots\)。火星人的任意两根手指都能随意交换位置,他们就是通过这方法计数的。
一个火星人用一个人类的手演示了如何用手指计数。如果把五根手指――拇指、食指、中指、无名指和小指分别编号为 \(1,2,3,4\) 和 \(5\),当它们按正常顺序排列时,形成了 \(5\) 位数 \(12345\),当你交换无名指和小指的位置时,会形成 \(5\) 位数 \(12354\),当你把五个手指的顺序完全颠倒时,会形成 \(54321\),在所有能够形成的 \(120\) 个 \(5\) 位数中,\(12345\) 最小,它表示 \(1\);\(12354\) 第二小,它表示 \(2\);\(54321\) 最大,它表示 \(120\)。下表展示了只有 \(3\) 根手指时能够形成的 \(6\) 个 \(3\) 位数和它们代表的数字:
| 三进制数 | 代表的数字 |
|---|---|
| \(123\) | \(1\) |
| \(132\) | \(2\) |
| \(213\) | \(3\) |
| \(231\) | \(4\) |
| \(312\) | \(5\) |
| \(321\) | \(6\) |
现在你有幸成为了第一个和火星人交流的地球人。一个火星人会让你看他的手指,科学家会告诉你要加上去的很小的数。你的任务是,把火星人用手指表示的数与科学家告诉你的数相加,并根据相加的结果改变火星人手指的排列顺序。输入数据保证这个结果不会超出火星人手指能表示的范围。
输入格式
共三行。
第一行一个正整数 \(N\),表示火星人手指的数目(\(1 \le N \le 10000\))。
第二行是一个正整数 \(M\),表示要加上去的小整数(\(1 \le M \le 100\))。
下一行是 \(1\) 到 \(N\) 这 \(N\) 个整数的一个排列,用空格隔开,表示火星人手指的排列顺序。
输出格式
\(N\) 个整数,表示改变后的火星人手指的排列顺序。每两个相邻的数中间用一个空格分开,不能有多余的空格。
样例 #1
样例输入 #1
5
3
1 2 3 4 5
样例输出 #1
1 2 4 5 3
提示
对于 \(30\%\) 的数据,\(N \le 15\)。
对于 \(60\%\) 的数据,\(N \le 50\)。
对于 \(100\%\) 的数据,\(N \le 10000\)。
noip2004 普及组第 4 题
思路
code
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 2e4;
int res = 0;//记录方案数
int n,m;
int mars[N];//存储一开始火星人手指数目
int arr[N];//存储方案
bool st[N];//记录某个数是否被访问过
bool flag = false;//标记是否找到最终方案
void dfs(int x) {//x代表当前第几位
if(flag) return ; //找到就return,避免不必要的搜索
if(x > n){
res ++;
if(res == m + 1){//注意此处是m+1,因为一开始火星人给出的就算第一个方案
flag = true;
for(int i = 1; i <= n; i++){
cout << arr[i] << " ";
}
cout << endl;
}
return ;
}
for(int i = 1;i <= n; i++){
if(!res){
i = mars[x];//从火星人给的初始序列按字典序顺序
}
if(!st[i]){
st[i] = true;//此个数字未被访问过
arr[x] = i;
dfs(x + 1);
st[i] = false;//恢复现场
arr[x] = 0;
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >>mars[i];
}
dfs(1);
return 0;
}
[NOIP2004 普及组] 火星人的更多相关文章
- P1088 [NOIP2004 普及组] 火星人
题目描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学 ...
- NOIP2004普及组第3题 FBI树
/* 1106: NOIP2004普及组第3题 FBI树 时间限制: 1 Sec 内存限制: 128 MB 提交: 10 解决: 9 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 我 ...
- [NOIP2004] 普及组
不高兴的津津 纯模拟 #include<cmath> #include<cstdio> #include<iostream> using namespace std ...
- 【递归】Vijos P1114 FBI树(NOIP2004普及组第三题)
题目链接: https://vijos.org/p/1114 题目大意: 把01串一分为二,左半边描述当前节点左子树,右半边描述右子树,子树全为1则为I节点,全为0则为B节点,混合则为F节点,直到当前 ...
- NOIP2002-2017普及组题解
虽然普及组一般都是暴力省一,但是有一些题目还是挺难的qwq个人觉得能进TG的题目会在前面打上'*' NOIP2002(clear) #include<bits/stdc++.h> usin ...
- NOIP2012 普及组 T3 摆花——S.B.S.
题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...
- NOIP2016普及组复赛解题报告
提高组萌新,DAY1DAY2加起来骗分不到300,写写普及组的题目聊以自慰. (附:洛谷题目链接 T1:https://www.luogu.org/problem/show?pid=1909 T2:h ...
- 05:统计单词数【NOIP2011复赛普及组第二题】
05:统计单词数 总时间限制: 1000ms 内存限制: 65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...
- [题解]noip2016普及组题解和心得
[前言] 感觉稍微有些滑稽吧,毕竟每次练的题都是提高组难度的,结果最后的主要任务是普及组抱一个一等奖回来.至于我的分数嘛..还是在你看完题解后写在[后记]里面.废话不多说,开始题解. 第一题可以说的内 ...
- NOIP2016普及组
普及组.代码有空发. 第一题就是买铅笔.暴力模拟绝对可取. 第二题就是回文日期.从t1的年份到t2的年份枚举每一年.头尾要特判. 第三题就是海港.骗了40分. 第四题就是魔法阵.不太好优化. 完.
随机推荐
- 一图读懂HUAWEI HiAI Foundation
作为华为端侧AI的创新开放平台,HMS Core的HUAWEI HiAI Foundation开放AI算力,助力AI应用高效开发,同时联合多领域打造AI生态,实现日调用600亿次的突破,助力AI生态繁 ...
- 动态库 DLL 封装五:dll中弹出一个dialog窗口
操作步骤: 1.在dll项目中,点击 资源,新建一个 dialog 2.cpp文件 CDialog dlg(IDD_STA); // 显示窗口 dlg.Create(IDD_STA, 0); dlg. ...
- Python生成唯一ID----UUID
# UUID 生成唯一ID # uuid 是Python内置模块,主要有五种算法. import uuid # uuid1() 基于时间戳 a1 = uuid.uuid1() print('uuid1 ...
- redis 简单整理——客户端哨兵模式[三十]
前言 简单介绍一下客户端的哨兵模式连接. 正文 Sentinel节点集合具备了监控.通知.自动故障转移.配置提供者若干 功能,也就是说实际上最了解主节点信息的就是Sentinel节点集合, 而各个 主 ...
- linux ssh连接
前言 整理以前的随笔. 正文 首先更新源 sudo apt-get update 安装ssh服务 sudo apt-get install openssh-server 检测是否已启动 ps -e | ...
- C#判断窗体是否被遮挡 - 开源研究系列文章
上次发布了托盘窗体的显示与隐藏的博文:,但是在测试窗体最大化的时候发现窗体没有隐藏,调试了下知道是窗体是否被遮挡这个函数的判断有问题.于是就研究了该代码,然后联系了该操作类的作者,也是博客园的园友,然 ...
- 【Oracle】Oracle常用分析函数(排名)
Oracle常用分析函数(排名) 一般来说,遇到需要对数据进行排序的时候,可以使用分析函数,一般常用的有三个,rank,dense_rank,row_number --Oracle常用分析函数(排名) ...
- 力扣178(MySQL)-分数排名(中等)
题目: 表: Scores 编写 SQL 查询对分数进行排序.排名按以下规则计算: 分数应按从高到低排列.如果两个分数相等,那么两个分数的排名应该相同.在排名相同的分数后,排名数应该是下一个连续的整数 ...
- 13_总结Vue数据监测
总结: Vue监视数据的原理: 1.vue会监视data中所有层次的数据 2.如何监视对象中的数据? 通过setter实现监视,且要在new V ...
- Dubbo-Admin 正式支持 3.0 服务治理
简介:Dubbo 相信大家并不陌生,是一款微服务开发框架,它提供了 RPC 通信与微服务治理两大关键能力.大家在日常开发中更多使用的是 Dubbo 提供的 RPC 通信这一部分能力,而对其提供的服务 ...