洛谷P1088——火星人(全排列+数学模拟)
题目描述
人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小的数字加到这个大数上面,把结果告诉火星人,作为人类的回答。
火星人用一种非常简单的方式来表示数字――掰手指。火星人只有一只手,但这只手上有成千上万的手指,这些手指排成一列,分别编号为1,2,3……。火星人的任意两根手指都能随意交换位置,他们就是通过这方法计数的。
一个火星人用一个人类的手演示了如何用手指计数。如果把五根手指――拇指、食指、中指、无名指和小指分别编号为1,2,3,4和5,当它们按正常顺序排列时,形成了5位数12345,当你交换无名指和小指的位置时,会形成5位数12354,当你把五个手指的顺序完全颠倒时,会形成54321,在所有能够形成的120个5位数中,12345最小,它表示1;12354第二小,它表示2;54321最大,它表示120。下表展示了只有3根手指时能够形成的6个3位数和它们代表的数字:
三进制数
123 132 213 231 312 321
代表的数字
1 2 3 4 5 6
现在你有幸成为了第一个和火星人交流的地球人。一个火星人会让你看他的手指,科学家会告诉你要加上去的很小的数。你的任务是,把火星人用手指表示的数与科学家告诉你的数相加,并根据相加的结果改变火星人手指的排列顺序。输入数据保证这个结果不会超出火星人手指能表示的范围。
输入输出格式
输入格式:
输入包括三行,第一行有一个正整数N,表示火星人手指的数目(1
<= N <= 10000)。第二行是一个正整数M,表示要加上去的小整数(1 <= M <=
100)。下一行是1到N这N个整数的一个排列,用空格隔开,表示火星人手指的排列顺序。
输出格式:
输出只有一行,这一行含有N个整数,表示改变后的火星人手指的排列顺序。每两个相邻的数中间用一个空格分开,不能有多余的空格。
输入输出样例
5
3
1 2 3 4 5
1 2 4 5 3
说明
对于30%的数据,N<=15;
对于60%的数据,N<=50;
对于全部的数据,N<=10000;
1 #include<cstdio>
2 #include<iostream>
3 #include<cmath>
4 #include<algorithm>
5 #include<cstring>
6 using namespace std;
7 int n,m,a[20000],i,j,t;
8
9 bool next(int p[],int n){ //数据存入p[0]~p[n-1]
10 int i,j,t;
11 for(i=n-2;i>0 && p[i]>p[i+1];i--); //从右向左,找第一个升序i (a[i]<a[i+1])
12 if(i<0)return false; //当前是字典序
13 for(j=n-1;p[i]>p[j];j--); //在i之后,找比a[i]大的最小元素a[j]
14 t=p[i];p[i]=p[j];p[j]=t; //a[i]与a[j]交换
15 for(i++,j=n-1;i<j;i++,j--){ //a[i+1]~a[n]逆置
16 t=p[i];p[i]=p[j];p[j]=t;
17 }
18 return true;
19 }
20
21 int main(){
22 cin>>n>>m;
23 for(i=0;i<n;i++)cin>>a[i];
24 while(m--)next(a,n);
25 for(i=0;i<n;i++)cout<<a[i]<<' ';
26 return 0;
27 }
洛谷P1088——火星人(全排列+数学模拟)的更多相关文章
- 洛谷——P1088 火星人
P1088 火星人 题目描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样的,首先,火星人把一个非常 ...
- 洛谷 P1088 火星人 (全排列)
直接调用next_permutation即可,向前的话可以调用prev_permutation #include<cstdio> #include<cctype> #inclu ...
- 洛谷 P1088 火星人
https://www.luogu.org/problemnew/show/P1088 这个题一开始是很蒙的 感觉很麻烦,每次都要交换balabala..... 后来才知道有这么一个神奇的stl 真是 ...
- 洛谷P1088 火星人【STL】【思维】
题目:https://www.luogu.org/problemnew/show/P1088 题意: 给定一个n个数的排列,要求得到这之后的第m个排列. 思路: next_permutation的简单 ...
- 洛谷P1088 火星人 [STL]
题目传送门 火星人 格式难调,题面就不放了. 分析: 这道题目不得不又让人感叹,还是$STL$大法好!!! $C++$的$algorithm$库中自带有$next\_permutation()$和$p ...
- 洛谷P1088 火星人
//其实就是全排列 //我们从外星人给的那串数字往下搜索 //一直往下拓展m次 //最后输出结果 //虽然看起来很暴力,但是题目上说了m非常小 #include<bits/stdc++.h> ...
- P1088 火星人——全排列函数
P1088 火星人 algorithm里面有一个next_permutation(a,a+n); #include<cstdio> #include<cstring> #inc ...
- [洛谷U72177]火星人plus
题目大意:给你一个$1\sim n(n\leqslant 10^5)$的排列,设$a$为它在$1\sim n$的全排列中的排名,求在$1\sim n$的全排列中第$a+m$个排列. 题解:康托展开以及 ...
- 洛谷试炼场-简单数学问题-P1088 火星人
洛谷试炼场-简单数学问题 A--P1088 火星人 Description 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法 ...
随机推荐
- Unsatisfied dependency expressed through field 'rabbitTemplate'错误总结
1. 在springboot中整合RabbitMq的过程中,遇到如下错误:(截取部分) org.springframework.beans.factory.UnsatisfiedDependencyE ...
- Java8新特性(二)之函数式接口
.subTitle { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); border- ...
- Java通过SSLEngine与NIO实现HTTPS访问
Java使用NIO进行HTTPS协议访问的时候,离不开SSLContext和SSLEngine两个类.我们只需要在Connect操作.Connected操作.Read和Write操作中加入SSL相关的 ...
- Lab: Brute-forcing a stay-logged-in cookie:点击保持登录状态返回的Cookie里面破解账号密码靶场复盘
靶场内容: 此实验室允许用户在关闭浏览器会话后仍保持登录状态.用于提供此功能的 cookie 容易受到暴力破解. 为了解决实验室问题,暴力破解 Carlos 的 cookie 以访问他的"我 ...
- NOIP 模拟 $26\; \rm 幻魔皇$
题解 \(by\;zj\varphi\) 观察可发现一个点向它的子树走能到的白点,黑点数是一个斐波那契数列. 对于白色点对,可以分成两种情况: 两个白点的 \(lca\) 是其中一个白点 两个白点的 ...
- Java Slf4j日志配置输出到文件中
1.概述 新项目需要增加日志需求,所以网上找了下日志配置,需求是将日志保存到指定文件中.网上找了下文章,发现没有特别完整的文章,下面自己整理下. 1.Java日志概述 对于一个应用程序来说日志记录是必 ...
- com.github.ulisesbocchio:jasypt-spring-boot-starter:2.0.0引用了sping cloud Finchley.M8版本,一直报错说不能从阿里云下载
解决方法: 1.找到idea或者eclipase中maven插件引向得settings.xml文件 2.修改文件中<mirror/>标签(配置仓库镜像用得)中<mirrorOf/&g ...
- QT 资源文件的添加
- 九:Decorator设计模式
二.使用Decorator设计模式增强request对象 Servlet API 中提供了一个request对象的Decorator设计模式的默认实现类HttpServletRequestWrappe ...
- await 关键字 后面跟Task 和Task <T>
1.Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: ◆ ThreadPool不支持线程的取消.完成.失败通知等交互性 ...