zoukankan      html  css  js  c++  java
  • 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("
    ");
    37     }
    38     return 0;
    39 }
    View Code
  • 相关阅读:
    MSSQLSERVER数据库 C#里调用存储过程,多参数查询,个人记录
    ASP.NET GridView和Repeater合并单元格
    C# XPath教程
    MSSQLSERVER数据库 导入文本文件
    MSSQLSERVER数据库 递归查询例子
    C# TreeView右键弹出菜单
    tomcat 下War包部署方法
    JAVA自定义标签教程及实例代码
    JAVA tag学习
    Java Quartz 自动调度
  • 原文地址:https://www.cnblogs.com/jihe/p/4888409.html
Copyright © 2011-2022 走看看