UVA 11925 Generating Permutations 逆向思维
2016-04-16 21:52
246 查看
题意:
给出两种操作:
1.交换前两个数
2.将第一个数放到最后
求一种操作步骤,使得1到n的升序排列变为指定序列,操作数不得超过2*(n^2)。
可以考虑将目标序列变为升序。
采取
1.交换前两个数
2.将最后一个数放到最前
之后逆序输出。
至于放到最前最后,可以将问题等价为一个环,指针"指"的位置永远是第一个位置,然后指针在上面移动。
给出两种操作:
1.交换前两个数
2.将第一个数放到最后
求一种操作步骤,使得1到n的升序排列变为指定序列,操作数不得超过2*(n^2)。
可以考虑将目标序列变为升序。
采取
1.交换前两个数
2.将最后一个数放到最前
之后逆序输出。
至于放到最前最后,可以将问题等价为一个环,指针"指"的位置永远是第一个位置,然后指针在上面移动。
#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> #include<vector> using namespace std; #define all(x) (x).begin(), (x).end() #define for0(a, n) for (int (a) = 0; (a) < (n); (a)++) #define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++) typedef long long ll; typedef pair<int, int> pii; const int INF =0x3f3f3f3f; const int maxn= 300 ; int a[maxn+5],n; vector<int >ve; void work() { int need=0,p=0,pos;ve.clear(); for0(i,n) { int t=(i+1)%n; if(a[t]==1) {pos=i;break;} } int st=(pos+1)%n; for(int i=(st+1)%n ;i!=st;i=(i+1)%n ) { for(int j=st;j!=i;j=(j+1)%n ) { if(a[j]>a[i]) need++; } } while( !( !need&&a[p]==1) ) { int q= (p+1)%n; if(p!=pos&&a[p]>a[q]) { swap(a[p],a[q]); ve.push_back(1); need--; continue; } ve.push_back(2); p= ((p-1)%n+n)%n; } for(int i=ve.size()-1;i>=0;i--) { printf("%d",ve[i]); } putchar('\n'); } int main() { while(~scanf("%d",&n)&&n) { for0(i,n) { scanf("%d",&a[i]); } work(); } return 0; }
相关文章推荐
- iOS开发小细节
- 第七章、Android动画深入分析
- HDU 5668 Circle
- 10w分区表,hive能跑,sparksql运行也完全能跑起来
- Mybatis
- 单源多点最短路径-Dijkstra算法
- 计算字符个数之机试
- 哎
- 单链表的插入操作的实现(0952)
- 第六章、android的Drawable
- VC PreTranslateMessage详解
- pandas学习笔记
- asp.net Forms身份验证详解
- WinCE上的mfc编程对文件的读写方法
- 使用 Gradle 编译 Java 项目时报错: Could not find Tools.jar
- 2106/04/16练习赛(四)
- 愿你目标清晰,从不曾动摇。。。
- Java语法基础-函数
- wait/notify实现生产消费模型
- 南阳ACM 找球号(2)