洛谷P1088 火星人【STL】【思维】】的更多相关文章

题目传送门 火星人 格式难调,题面就不放了. 分析: 这道题目不得不又让人感叹,还是$STL$大法好!!! $C++$的$algorithm$库中自带有$next\_permutation()$和$prev\_permutation()$函数,可以自动生成一个排列的下一个或上一个排列,那么这道题不久轻松被切了嘛~ $STL$真的是个好东西. Code: #include<cstdio> #include<cstring> #include<cstdlib> #inclu…
P1088 火星人 题目描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小的数字加到这个大数上面,把结果告诉火星人,作为人类的回答. 火星人用一种非常简单的方式来表示数字――掰手指.火星人只有一只手,但这只手上有成千上万的手指,这些手指排成一列,分别编号为1,2,3…….火星人的任意两根手指都能随意交换位置,…
题目:https://www.luogu.org/problemnew/show/P1088 题意: 给定一个n个数的排列,要求得到这之后的第m个排列. 思路: next_permutation的简单应用. 题意本身是说找到m加上当前值之后在火星人的表示法里的数. 但是本身加减顺序是可换的,题意可以变换成当前的值之后的第m个 所以当前的排列之前的根本不需要管,只用从当前开始,跑m次next_permutation就可以了. #include<stdio.h> #include<stdli…
https://www.luogu.org/problemnew/show/P1088 这个题一开始是很蒙的 感觉很麻烦,每次都要交换balabala..... 后来才知道有这么一个神奇的stl 真是太好用了 疯狂爆灯!!! next_permutation(a,a+n) 是可以求数组a的n位的全排列的下一位的 真是为这个题量身打造.... 看代码吧: #include<bits/stdc++.h> using namespace std; ],n,m; int main(){ scanf(&…
直接调用next_permutation即可,向前的话可以调用prev_permutation #include<cstdio> #include<cctype> #include<algorithm> #define REP(i, a, b) for(int i = (a); i < (b); i++) #define _for(i, a, b) for(int i = (a); i <= (b); i++) using namespace std; co…
题目描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小的数字加到这个大数上面,把结果告诉火星人,作为人类的回答. 火星人用一种非常简单的方式来表示数字――掰手指.火星人只有一只手,但这只手上有成千上万的手指,这些手指排成一列,分别编号为1,2,3--.火星人的任意两根手指都能随意交换位置,他们就是通过这方法计…
//其实就是全排列 //我们从外星人给的那串数字往下搜索 //一直往下拓展m次 //最后输出结果 //虽然看起来很暴力,但是题目上说了m非常小 #include<bits/stdc++.h> #define inf 0x7fffffff #define ll long long using namespace std; int n,m; #define maxn 10009 int a[maxn]; int b[maxn]; bool in[maxn]; ; void dfs(int rest…
洛谷题目传送门 神仙思维题还是要写点东西才好. 树 每次操作把相邻且同色的点反色,直接这样思考会发现状态有很强的后效性,没办法考虑转移. 因为树是二分图,所以我们转化模型:在树的奇数层的所有点上都有一枚棋子,每次可以将棋子移向相邻的空位,目标状态是树的偶数层的所有点上都有棋子. 这样的互换总次数有没有一个下界呢? 我们求出\(a_i\)表示点\(i\)子树中棋子数量与空位数量之差(可以是负数),那么\(i\)的父边就至少要交换\(|a_i|\)次. 为什么呢?子树里面空位比棋子少的话,肯定要通过…
P1876 开灯 题目背景 该题的题目是不是感到很眼熟呢? 事实上,如果你懂的方法,该题的代码简直不能再短. 但是如果你不懂得呢?那...(自己去想) 题目描述 首先所有的灯都是关的(注意是关!),编号为1的人走过来,把是一的倍数的灯全部打开,编号为二的的把是二的倍数的灯全部关上,编号为3的人又把是三的倍数的灯开的关上,关的开起来……直到第N个人为止. 给定N,求N轮之后,还有哪几盏是开着的. 输入输出格式 输入格式: 一个数N,表示灯的个数和操作的轮数 输出格式: 若干数,表示开着的电灯编号…
题目大意:给你一个$1\sim n(n\leqslant 10^5)$的排列,设$a$为它在$1\sim n$的全排列中的排名,求在$1\sim n$的全排列中第$a+m$个排列. 题解:康托展开以及逆康托展开.将原排列转为变进制数,加上$m$,再用转回排列.转回去可以用在树状数组上二分来解决.这里使用了$skip2004$教的两种方法. 卡点:变进制数加法时写错 C++ Code: #include <cstdio> #include <iostream> #include &l…