zoukankan      html  css  js  c++  java
  • [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]);
    	}
    }
    
  • 相关阅读:
    ajax chrome load
    不一样的自拍
    jQuery点击空白关闭弹出层
    笔记整理
    带三角缺口的边框
    连续input在同一行对齐问题
    用Windows PowerShell 控制管理 Microsoft Office 365
    Qt and C++ Reflection,利用Qt简化C++的反射实现
    滴滴打车推出的“专车服务”后的见闻以及思考
    Exchange的AutoDiscover服务
  • 原文地址:https://www.cnblogs.com/ytxytx/p/9519100.html
Copyright © 2011-2022 走看看