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> dq;
vector<int> ans;

bool judge() {
    for(int i = 1; i <= n; i++)
        if(dq[i - 1] != i)
            return false;
    return true;
}

int main() {
    while(scanf("%d", &n) == 1 && n) {
        dq.clear();
        ans.clear();
        int t;
        for(int i = 1; i <= n; i++) {
            scanf("%d", &t);
            dq.push_back(t);
        }

        int MAX = 2 * n * n;
        for(int i = 0; i <= MAX; i++) {
            int x = dq[0];
            int y = dq[1];
            if(x == 1 && judge()) {
                break;
            }
            if(x > y && x != n) {
                ans.push_back(1);
                swap(dq[0],dq[1]);
            }
            else {
                ans.push_back(2);
                t = dq.back();
                dq.pop_back();
                dq.push_front(t);
            }
        }
        for(int i = ans.size() - 1; i >= 0; i--)
            printf("%d", ans[i]);
        printf("\n");
    }
    return 0;
}
时间: 2024-11-04 03:51:47

UVA - 11925 Generating Permutations 推理的相关文章

uva 11925 Generating Permutations

题意: 给定一到n的序列,按照下列规则,将序列排为升序列 1.交换前两个数 2.将最后一个数放在最前面(紫书错了,害惨我了) 数据量为300,刘汝佳提示是最多2*n*n次操作,所以我选择了数组模拟,正常数组无法将最后一个放到前面,所以我将数组倒置 因为没有要求最优解,只要能得到想要的结果就行了,所以采取了构造法 只要在第一个比第二个小,那么就把最后一个放到最前面,否则就交换前两个,这样就可以把大的慢慢往后放,如果n 1的情况,那么就要把最后一个放到最后面,不然就会陷入循环 例如4 2 3 1  

UVA 11925 Generating Permutations 生成排列

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

UVa 11925 Generating Permutations (构造法)

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

uva 1561 - Cycle Game(推理)

option=com_onlinejudge&Itemid=8&page=show_problem&problem=4336" style="">题目链接:uva 1561 - Cycle Game 题目大意:给出一个环,每次从起点開始,能够选择一个权值非0的边移动,移动后减掉权值至少1点. 不能移动的为失败. 解题思路: 1:有0的情况,假设有方向离权值为0的边的步数为奇数,则为必胜.否则必败. 2:无0的情况,奇数边必胜: 3:有1的情况.同

UVA - 11892 ENimEN (推理)

Description  ENimEN  In deterministic games no chance is involved, meaning that the final result can be predicted from the initial arrangement assuming players play optimal. These games are so boring. piloop and poopi are professional gamers. They pl

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 组合语