zoukankan      html  css  js  c++  java
  • SDUT 3568 Rock Paper Scissors 状压统计

    就是改成把一个字符串改成三进制状压,然后分成前5位,后5位统计,

    然后直接统计 f[i][j][k]代表,后5局状压为k的,前5局比和j状态比输了5局的有多少个人

    复杂度是O(T*30000*25*m)m比较小,也就最多几十吧,将将过

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    #include <cstdlib>
    #include <vector>
    #include <cmath>
    #include <queue>
    #include <map>
    #include <string>
    using namespace std;
    typedef long long LL;
    const int N=3e4+5;
    const int M=243;
    const int INF=0x3f3f3f3f;
    int get(int x,int y){
      int ret=0;
      for(int k=0;k<5;++k){
        int dig0=x%3,dig1=y%3;
        if(dig0==(dig1+1)%3)++ret;
        x/=3,y/=3;
      }
      return ret;
    }
    vector<int> win[6][M],lose[6][M];
    int T,cas,n,a[N][11],ret[N][11],f[6][M][M];
    char ch[15];
    int main(){
       for(int i=0;i<M;++i){
        for(int j=0;j<M;++j){
          win[get(i,j)][i].push_back(j);
          lose[get(i,j)][j].push_back(i);
        }
       }
       scanf("%d",&T);
       while(T--)
       {
        scanf("%d",&n);
        for(int i=0;i<n;++i)
        {
          scanf("%s",ch);
          for(int j=0;j<10;++j)
          {
            if(ch[j]=='R')a[i][j]=0;
            else if(ch[j]=='P')a[i][j]=1;
            else a[i][j]=2;
          }
        }
        memset(f,0,sizeof(f));
        memset(ret,0,sizeof(ret));
        for(int i=0;i<n;++i)
        {
           int mask0=0,mask1=0;
           for(int j=0;j<5;++j)mask0=mask0*3+a[i][j];
           for(int j=5;j<10;++j)mask1=mask1*3+a[i][j];
           for(int j=0;j<=5;++j)
           {
              for(int k=0;k<lose[j][mask0].size();++k)
              {
                  int t=lose[j][mask0][k];
                  ++f[j][t][mask1];
              }
           }
        }
        for(int i=0;i<n;++i){
           int mask0=0,mask1=0;
           for(int j=0;j<5;++j)mask0=mask0*3+a[i][j];
           for(int j=5;j<10;++j)mask1=mask1*3+a[i][j];
           for(int s0=0;s0<=5;++s0)
             for(int s1=0;s1<=5;++s1){
               for(int k=0;k<win[s1][mask1].size();++k){
                 int t=win[s1][mask1][k];
                 ret[i][s0+s1]+=f[s0][mask0][t];
               }
             }
          --ret[i][0];
        }
        printf("Case #%d:
    ",++cas);
        for(int i=0;i<n;++i){
          for(int j=0;j<10;++j)
            printf("%d ",ret[i][j]);
          printf("%d
    ",ret[i][10]);
        }
       }
       return 0;
    }
    View Code
  • 相关阅读:
    【转】SQL时间函数
    C#操作Word完全方法
    出水芙蓉,风华绝代记民国才女林徽因
    梅超风:我就是那个多年以前的女子
    厉胜男
    南海恶神
    挪窝
    吴若权——洛可可动画电影馆
    美的慢箭
    机械公敌(I, Robot) 场景设定
  • 原文地址:https://www.cnblogs.com/shuguangzw/p/5585715.html
Copyright © 2011-2022 走看看