zoukankan      html  css  js  c++  java
  • uva 11212 Editing a Book

    https://vjudge.net/problem/UVA-11212

    题意:

    n个数的排列,每次操作可以移动连续的一段

    最问少移动多少次使这n个数升序排列

    IDA*

    估价函数:

    考虑后即不正确的数字个数sum

    每次移动最多使sum减少3

    所以如果剩余递归层数*3<sum ,剪枝

    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,T,maxd;
    bool stop;
    bool check(int *a)
    {
        bool p=true;
        for(int i=1;i<=n;i++)
         if(a[i]!=i)  { p=false; break; }
        return p;
    }
    void dfs(int now,int *a)
    {
        if(stop) return;
        if(now==maxd+1) 
        { 
            if(check(a))  stop=true; 
            return;
        }
        int sum=0;
        for(int i=1;i<n;i++) if(a[i+1]!=a[i]+1) sum++;
        if((maxd-now+1)*3<sum) return;
        int tmp[10];
        memcpy(tmp,a,sizeof(*tmp)*(n+1));
        for(int len=1;len<n;len++)
          for(int s=2;s+len-1<=n;s++)
           for(int pos=1;pos<s;pos++)
            {
                for(int i=1;i<=len;i++) a[pos+i-1]=tmp[s+i-1];
                for(int i=pos,j=1;i<s;i++,j++) a[pos+len-1+j]=tmp[i];
                dfs(now+1,a);
                memcpy(a,tmp,sizeof(*a)*(n+1)); 
            }    
    }
    int main()
    {
        int a[10]; 
        while(scanf("%d",&n)==1)
        {
            if(!n) return 0;
            T++; bool ok=true; stop=false;
            for(int i=1;i<=n;i++) 
            {
                scanf("%d",&a[i]);
                if(a[i]<a[i-1]) ok=false;
            }
            if(ok) { printf("Case %d: 0
    ",T); continue; }
            for(maxd=1;maxd<=n;maxd++)
            {
                dfs(1,a);
                if(stop) { printf("Case %d: %d
    ",T,maxd); break; }
            }
        }
    }
  • 相关阅读:
    SpringBoot页面访问处理
    体验SpringBoot
    体验SpringBoot
    Scala基础
    修改容器配置使其永久生效
    [徐培成系列实战课程]docker篇
    v1.0.2-2017.04.26
    修改容器的hosts文件
    配置spark集群
    配置docker容器上ssh无密登录
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/7282164.html
Copyright © 2011-2022 走看看