zoukankan      html  css  js  c++  java
  • 洛谷P2534 [AHOI2012]铁盘整理

    P2534 [AHOI2012]铁盘整理

    题目描述

    输入输出格式

    输入格式:

    共两行。第一行为铁盘个数N(1<=N<=50),第二行为N个不同的正整数,分别为从上到下的铁盘的半径R。(1<=R<=100)

    输出格式:

    一个正整数,表示使铁盘从小到大有序需要的最少翻转次数。

    输入输出样例

    输入样例#1:
    5
    2 4 3 5 1
    输出样例#1:
    5
    //第一种:使用string.h中的strrev函数,只用于字符串 
    #include <iostream>  
    #include <cstring>  
    using namespace std;  
    int main()  
    {  
        char s[]="hello";  
        strrev(s);  
        cout<<s<<endl;   
        return 0;  
    }  
    
    
    //第二种:使用algorithm中的reverse函数,也适用于整型数组及其他存储结构 
    #include <iostream>  
    #include <string>  
    #include <algorithm>  
    using namespace std;  
      
    int main()  
    {  
        string s="hello";  
        reverse(s.begin(),s.end());  
        cout<<s<<endl;  
        return 0;  
    }   
    反转操作
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #define mod1 2333333
    #define mod2 1048577
    #define maxn 51
    using namespace std;
    int n,t[maxn];
    struct node{
        int a[maxn],step;
    }cur,nxt;
    queue<node>q;
    bool vis1[2333333],vis2[1048577];
    int hash1(int x[]){
        int res=1;
        for(int i=1;i<=n;i++)res=(res*103%mod1+x[i])*13%mod1;
        return res;
    }
    int hash2(int x[]){
        int res=1;
        for(int i=1;i<=n;i++)res=(res*117%mod2+x[i])*27%mod2;
        return res;
    }
    int main(){
        freopen("Cola.txt","r",stdin);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&cur.a[i]),t[i]=cur.a[i];
        sort(t+1,t+n+1);
        int t1=hash1(t),t2=hash2(t);
        if(hash1(cur.a)==t1&&hash2(cur.a)==t2){puts("0");return 0;}
        cur.step=0;
        q.push(cur);
        while(!q.empty()){
            cur=q.front();q.pop();
            for(int i=2;i<=n;i++){
                nxt=cur;
                reverse(nxt.a+1,nxt.a+i+1);
                int h1=hash1(nxt.a),h2=hash2(nxt.a);
                if(h1==t1&&h2==t2){
                    printf("%d",cur.step+1);
                    return 0;
                }
                if(!vis1[h1]||!vis2[h2]){
                    vis1[h1]=1;vis2[h2]=1;
                    nxt.step=cur.step+1;
                    q.push(nxt);
                }
            }
        }
        return 0;
    }
    20分 裸搜
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    #define maxn 51
    using namespace std;
    int n,a[maxn];
    struct node{
        int w,id;
        bool operator < (const node b)const{
            return w<b.w;
        }
    }e[maxn];
    int get(){
        int res=0;
        for(int i=2;i<=n;i++)
            if(abs(a[i]-a[i-1])!=1)res++;
        return res;
    }
    void dfs(int limit,int step){
        int h=get();
        if(!h&&a[1]<a[2]){
            printf("%d",limit);
            exit(0);
        }
        if(h+step>limit||step==limit)return;
        for(int i=2;i<=n;i++){
            if(abs(a[i]-a[i+1])!=1){
                reverse(a+1,a+i+1);
                dfs(limit,step+1);
                reverse(a+1,a+i+1);
            }
        }
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&e[i].w),e[i].id=i;
        sort(e+1,e+n+1);
        for(int i=1;i<=n;i++)a[e[i].id]=i;
        a[0]=-0x7f7f7f7f;a[n+1]=0x7f7f7f7f;
        for(int k=0;;k++)dfs(k,0);
    }
    100分 迭代加深搜索
  • 相关阅读:
    Ymodem协议(参考STM32)
    嵌入式 Linux 对内存的直接读写(devmem)
    四则运算表达式分解,前中后缀表达式(栈的应用)
    I2C总线的仲裁机制
    用例图【图7】--☆
    顺序图【6】--☆☆
    部署图【图5】--☆
    组件图【图4】--☆
    活动图、泳道【图1】--☆☆
    Mybatis增删改查(CURD)
  • 原文地址:https://www.cnblogs.com/thmyl/p/7687749.html
Copyright © 2011-2022 走看看