zoukankan      html  css  js  c++  java
  • Card Hand Sorting 二进制枚举暴力

      这个题其实由于只有4种花色的,那么每种花色排列的顺序,也不过是4!种,然后对于每种花色内部到底是升序还是降序,其实也可以直接暴力,一共也就4!*2^4种情况,然后直接进行排序就可以了,但是我们如何计算需要移动的位置呢???我们这样考虑,我们由于要保证内部有序,那么最后一定是一个升序或者降序,那么插入一张牌,实际上是相当改变内部相对位置,那么考虑无序的,我们肯定是找到最长的递增子序列,那么他们一定是不用互相移动的,而其他的肯定是要移动的,因为他们不满足前后的顺序,并且他们是肯定是要移动的,直接二进制枚举即可。

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    struct node{
       int id;
       int val;
       int col;
       int flag;
    }a[105];
    int dp[69];
    int col[4]={0,1,2,3};
    char s[105];
    int n;
    bool cmp(node x,node y){
       if (x.col==y.col){
          return x.flag<y.flag;
       }
       return col[x.col]<col[y.col];
    }
    int LCS(){
        memset(dp,0,sizeof(dp));
        int ans=1;
        for (int i=1;i<=n;i++){
            dp[i]=1;
            for (int j=1;j<i;j++){
                if (a[i].id>a[j].id){
                    dp[i]=max(dp[i],dp[j]+1);
                }
            }
            ans=max(ans,dp[i]);
        }
        return ans;
    }
    int main(){
      while(~scanf("%d",&n)){
      int ans=0x3f3f3f3f;
      for (int i=1;i<=n;i++){
         scanf("%s",s);
         if (s[0]=='T')
            a[i].val=10;
         else if (s[0]=='J')
            a[i].val=11;
         else if (s[0]=='Q')
            a[i].val=12;
         else if (s[0]=='K')
            a[i].val=13;
         else if (s[0]=='A')
            a[i].val=14;
         else
            a[i].val=s[0]-'0';
         if (s[1]=='s')a[i].col=0;
         else if (s[1]=='h')a[i].col=1;
         else if (s[1]=='d')a[i].col=2;
         else a[i].col=3;
         a[i].id=i;
      }
      //cout<<"sssssss";
      do{
        for (int i=1;i<16;i++){
            for (int j=1;j<=n;j++){
                 a[j].flag=a[j].val*(((i>>col[a[j].col])&1)?1:-1);
            }
            sort(a+1,a+1+n,cmp);
            int minn=n-LCS();
            ans=min(ans,minn);
        }
    
      }while(next_permutation(col,col+4));
      printf("%d
    ",ans);
      }
      return 0;
    }
  • 相关阅读:
    负载均衡获得真实源IP的6种方法
    美图全链路监控实战
    移动端APM网络监控与优化方案
    k8s 如何对外提供服务
    mysql5.7安装audit审计插件
    mysql 5.7安装密码校验插件validate_password
    Linux Crontab 定时任务
    stm32 hard fault usage fault UNALIGNED -> task stack overflow
    linux逻辑卷管理(LVM)
    suse11开启telnet服务
  • 原文地址:https://www.cnblogs.com/bluefly-hrbust/p/11628677.html
Copyright © 2011-2022 走看看