• [UVa1637]Double Patience


    题目大意

    给你九堆牌,每堆四张

    有以下操作,如果当前状态有两堆牌顶牌数值相等,那么可以取走这两张

    但是当一种状态有多对相等的牌顶,就随机操作其中一对

    求最终取完的概率

    解题思路

    考虑到状态数很少,我们用五进制数(st)表示当前每一堆牌分别已经取了几张

    可以令(dp_{st})表示到达过这种状态的概率

    首先(dp_0=1),因为经过一张牌都没取这种状态的概率必定是(1)

    按照(0 sim 5^{9}-1)的顺序进行转移

    然后对当前状态统计有多少对牌顶是相同的,为(cnt)

    那么转移到这些状态的概率是相同的,都是(frac{dp_i}{cnt})

    如果(j)(k)牌顶的牌相同,那么下一个状态就是(i+5^j+5^k)

    直接(dp_{i+5^j+5^k}+=frac{dp_i}{cnt})即可

    如果(cnt=0),那么想象一下,这种情况就是没有可取的牌了,直接跳过

    最终统计答案就是(dp_{5^9-1})

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    const int Mi[9]={1,5,25,125,625,3125,15625,78125,390625};
    const double eps=1e-9;
    
    bool read(int &s){
    	char ch;
    	while (isspace(ch=getchar()));
    	if (!(ch=='A'||ch=='T'||ch=='J'||ch=='K'||ch=='Q'||('2'<=ch&&ch<='9'))) return false;
    	switch (ch){
    		case 'A':{s=1;break;}
    		case 'T':{s=10;break;}
    		case 'J':{s=11;break;}
    		case 'Q':{s=12;break;}
    		case 'K':{s=13;break;}
    		default:{s=ch&15;break;}
    	}
    	ch=getchar();
    	return true;
    }
    
    int Card[9][4],V[9];
    double dp[3000000];
    
    int main(){
    	while (1){
    		memset(dp,0,sizeof(dp));
    		for (int i=0;i<9;i++)
    			for (int j=3;~j;j--){
    				if (!read(Card[i][j])) return 0;
    			}
    		dp[0]=1;
    		for (int i=0;i<1953125;i++){
    			if (dp[i]<eps) continue;
    			int cnt=0;
    			int S=i;
    			for (int j=0;j<9;j++,S/=5) V[j]=S%5;
    			for (int j=0;j<8;j++){
    				if (V[j]==4) continue;
    				for (int k=j+1;k<9;k++){
    					if (V[k]==4) continue;
    					if (Card[j][V[j]]==Card[k][V[k]]) cnt++;
    				}
    			}
    			if (!cnt) continue;
    			double ech=dp[i]/cnt;
    			for (int j=0;j<8;j++){
    				if (V[j]==4) continue;
    				for (int k=j+1;k<9;k++){
    					if (V[k]==4) continue;
    					if (Card[j][V[j]]==Card[k][V[k]]){
    						dp[i+Mi[j]+Mi[k]]+=ech;
    					}
    				}
    			}
    		}
    		printf("%.6f
    ",dp[1953124]);
    	}
    }
    
  • 相关阅读:
    python 自定义去掉空行
    JavaScript 获取时间函数
    python 自定义ssh
    python 去掉空行
    python roboot解析 output.xml
    语音识别-windows
    python 自定义request模块调试
    python 自定义装饰器
    python 自定义Server酱模块编写
    python 自定义exception模块
  • 原文地址:https://www.cnblogs.com/ytxytx/p/9519100.html
Copyright © 2020-2023  润新知