uva 11925 Generating Permutations

题意:

给定一到n的序列,按照下列规则,将序列排为升序列

1.交换前两个数

2.将最后一个数放在最前面(紫书错了,害惨我了)

数据量为300,刘汝佳提示是最多2*n*n次操作,所以我选择了数组模拟,正常数组无法将最后一个放到前面,所以我将数组倒置

因为没有要求最优解,只要能得到想要的结果就行了,所以采取了构造法

只要在第一个比第二个小,那么就把最后一个放到最前面,否则就交换前两个,这样就可以把大的慢慢往后放,如果n 1的情况,那么就要把最后一个放到最后面,不然就会陷入循环

例如4 2 3 1      2 4 3 1     1 2 4 3     3 1 2 4    1 3 2 4    4 1 3 2    1 4 3 2    2 1 4 3     1 2 4 3 (没有想明白为什么,各位看官明白的话,求留言)

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<vector>
 4 #include<cstdio>
 5 using namespace std;
 6 const int maxn=10000000+5;
 7
 8 int dp[maxn];
 9
10 int main(){
11     int n;
12     while(cin>>n){
13         vector<int> ans;
14         for(int i=n-1;i>=0;i--)
15             cin>>dp[i];
16         int R=0,L=n-1;
17         while(1){
18             int temp=1;
19             bool ok=1;
20             for(int i=L;i>=R;i--)
21                 if(dp[i]!=(temp++)){
22                     ok=0;break;
23                 }
24             if(ok)break;
25             if(dp[L]<dp[L-1]){
26                 ans.push_back(2);
27                 dp[++L]=dp[R++];
28             }
29             else{
30                 ans.push_back(1);
31                 swap(dp[L],dp[L-1]);
32             }
33         }
34         for(int i=(int)ans.size()-1;i>=0;--i)
35             printf("%d",ans[i]);
36         printf("\n");
37     }
38     return 0;
39 }

时间: 2024-12-19 01:02:04

uva 11925 Generating Permutations的相关文章

UVA 11925 Generating Permutations 生成排列

题意:要用一个有序的序列生成给定序列,操作有两种,一是交换前两个元素,二是把第一个元素移动到最后去. 思路有两种: 1.映射,把给定序列映射成有序的序列,然后按照同样的替换规则把有序的序列映射掉,然后就可以排序啦. 具体解释可以看SRM 664的C题 2.逆向思考,把给定序列变成有序,操作相应变化一下,最后逆序输出操作. 至于排序的问题,把序列看成一个环,第二种操作相当改变了可交换元素的位置,然后就可以等效为冒泡排序啦... 第二种思路需要注意的一点是,是因为是环状的,和冒泡排序有所区别,最大的

UVa 11925 Generating Permutations (构造法)

题意:给定一个序列,让你从一个升序列变成该序列,并且只有两种操作,操作1:交换前两个元素,操作2:把第一个元素移动到最后. 析:一开始的时候吧,不会,还是看的题解,首先是要逆序来做,这样可能好做一点,那么操作1不变,操作2变成把最后一个元素放到最前面. 就像是冒泡排序一样,如果第一个元素大于第二个,交换顺序,否则就把最后一个元素移动到最前面,但第三个样例就死循环了,我也算过,这样会一直重复某几个状态, 所以我们要维护第一个值,如果是最大的元素,那么就不让他们交换了. 代码如下: #include

UVA - 11925 Generating Permutations 推理

题目大意:这题的题目是错的,他的第二个操作是把最后一个调到第一个,然后输出时要逆序输出 解题思路:类似冒泡排序法.先如果第一个是n的话,就调后面的到前面来,然后进行比较,取最大的放前面,这下下一次n到前面的时候,n-1就在n的后面了. #include<cstdio> #include<vector> #include<deque> #define maxn 310 using namespace std; int num[maxn], n; deque<int&

UVA - 10098 - Generating Fast (枚举排列)

思路:生成全排列,用next_permutation,注意生成之前先对那个字符数组排序. AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; char str[20]; int main() { int n; cin >> n; while(n-

uva 10098 Generating Fast(全排列)

还是用的两种方法,递归和STL,递归那个是含有反复元素的全排列,这道题我 没有尝试没有反复元素的排列,由于从题目上并没有发现一定是有反复元素的() 贴代码: <span style="font-family:Courier New;font-size:18px;">#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

【转】编程词汇

很实用的编程英语词库,共收录一千五百余条词汇. 第一部分: application 应用程式 应用.应用程序 application framework 应用程式框架.应用框架 应用程序框架 architecture 架构.系统架构 体系结构 argument 引数(传给函式的值).叁见 parameter 叁数.实质叁数.实叁.自变量 array 阵列 数组 arrow operator arrow(箭头)运算子 箭头操作符 assembly 装配件 assembly language 组合语

【转】Java 专业词汇

原址:http://blog.csdn.net/xiaojunjuns1/article/details/52729861 abstract (关键字)             抽象 ['.bstr.kt] access                            vt.访问,存取 ['.kses]'(n.入口,使用权) algorithm                     n.算法 ['.lg.riem] annotation                     [Java

计算机英语词汇--算法

算法常用术语中英对照Data Structures 基本数据结构Dictionaries 字典PriorityQueues 堆Graph Data Structures 图Set Data Structures 集合Kd-Trees 线段树Numerical Problems 数值问题Solving LinearEquations 线性方程组Bandwidth Reduction 带宽压缩Matrix Multiplication 矩阵乘法Determinants and Permanents