2011年7月27日水曜日

TopCoder SRM 513

TopCoder SRM 513(7/26 20:00~22:00)

珍しい時間帯のSRM.夕飯後は眠くなるので辛い.

■YetAnotherIncredibleMachine(Easy)

・解法

全探索.
  1. import java.util.*;  
  2. import java.lang.*;  
  3. import java.math.*;  
  4. import java.io.*;  
  5.   
  6. import static java.lang.Math.*;  
  7. import static java.util.Arrays.*;  
  8.   
  9. public class YetAnotherIncredibleMachine {  
  10.  // long INF=1L<<48;  
  11.  int INF=1<<28;  
  12.  double EPS=1e-9;  
  13.   
  14.  public int countWays(int[] mount, int[] length, int[] balls) {  
  15.   int n=length.length;  
  16.   int m=balls.length;  
  17.   long res=1;  
  18.   long mod=1000000009;  
  19.   for(int j=0;j<n;j++){   
  20.    int c=0;  
  21.    for(int x=-length[j];x<=0;x++){  
  22.     boolean f=true;  
  23.     for(int i=0;i<m;i++){  
  24.      if(mount[j]+x<=balls[i]&&balls[i]<=mount[j]+x+length[j]){  
  25.       f=false;  
  26.      }  
  27.     }  
  28.     if(f){  
  29.      c++;  
  30.     }  
  31.    }  
  32.    res=(res*c)%mod;  
  33.   }  
  34.   return (int)res;  
  35.  }  
  36.   
  37.  void debug(Object...os){  
  38.   System.err.println(Arrays.deepToString(os));  
  39.  }  
  40.   
  41.  void print(String s){  
  42.   System.out.print(s);  
  43.  }  
  44.   
  45.  void println(String s){  
  46.   System.out.println(s);  
  47.  }  
  48. }  
  49.   
  50.   
  51. // Powered by FileEdit  
  52. // Powered by TZTester 1.01 [25-Feb-2003]  
  53. // Powered by CodeProcessor  

■PerfectMemory(Medium)

n(:偶数)枚のカードで神経衰弱を行う.一度めくったカードを全て記憶しておくことができるとしたとき,最適な戦略を用いた場合のゲーム終了までにめくる回数の期待値を求めよ.

解法

(残り枚数, 既に知っているカードの枚数)で期待値のDP.
既に知っているカードには,ペアは含まれない(=どの2枚も異なる)とする.
状態が(n, m)の時,n-mから1枚引く.
図では,暗い赤が知っているm枚(引かれないカード), 明るい赤は暗い赤のカードに対応するペアの片割れ.

1.明るい赤を引いた時(m枚)

対応するカードを暗い赤から選ぶ. つまり,1ターンで,状態が(n-2,m-1)になる. よって,この時の期待値は1+dp(n-2,m-1).

2.青を引いた時(n-2m枚)

引いたカードを暗い紫とする.この時対応するカードは青にある(明るい紫). 次に,n-m-1(青+明るい赤+明るい紫)から1枚引く.

2.1.明るい赤を引いたとき(m枚)

次のターンで,対応する赤のペアを引く. この時の期待値は,2+dp(n-2,m).

2.2.青を引いたとき(n-2m-2枚)

既に知っているカードが2枚増えるだけなので, この時の期待値は,1+dp(n,m+2).

2.3.明るい紫を引いたとき(1枚)

紫ペアがなくなるので,この時の期待値は,1+(n-2,m).

これらからDPテーブルを更新していきます.初期値の与え方が面倒なので,メモ化再帰でもいいかも知れません.
  1. import java.util.*;  
  2. import java.lang.*;  
  3. import java.math.*;  
  4. import java.io.*;  
  5.   
  6. import static java.lang.Math.*;  
  7. import static java.util.Arrays.*;  
  8.   
  9. public class PerfectMemory {  
  10.  // long INF=1L<<48;  
  11.  int INF=1<<28;  
  12.  double EPS=1e-9;  
  13.   
  14.  public double getExpectation(int N, int M) {  
  15.   int n=N*M;  
  16.   double[][] dp=new double[n+1][n+1];  
  17.   for(int j=2;j<=n;j+=2){  
  18.    for(int i=j;i>=j/2;i--){  
  19.     dp[j][i]=j/2;  
  20.    }  
  21.    for(int i=j/2-1;i>=0;i--){  
  22.     double p1=(double)(j-2*i)/(j-i);  
  23.     double p2=(double)i/(j-i);  
  24.     double q1=(double)i/(j-i-1);  
  25.     double q2=(double)(j-2*i-2)/(j-i-1);  
  26.     double q3=(double)1/(j-i-1);  
  27.     dp[j][i]+=(2+dp[j-2][i])*p1*q1;  
  28.     dp[j][i]+=(1+dp[j][i+2])*p1*q2;  
  29.     dp[j][i]+=(1+dp[j-2][i])*p1*q3;  
  30.     if(i>0){  
  31.      dp[j][i]+=(1+dp[j-2][i-1])*p2;  
  32.     }  
  33.    }  
  34.   }  
  35.   for(int i=0;i<=n;i+=2){  
  36.    // debug(i, dp[i]);  
  37.   }  
  38.   return dp[n][0];  
  39.  }  
  40.   
  41.  void debug(Object...os){  
  42.   System.err.println(Arrays.deepToString(os));  
  43.  }  
  44.   
  45.  void print(String s){  
  46.   System.out.print(s);  
  47.  }  
  48.   
  49.  void println(String s){  
  50.   System.out.println(s);  
  51.  }  
  52. }  
  53.   
  54.   
  55. // Powered by FileEdit  
  56. // Powered by TZTester 1.01 [25-Feb-2003]  
  57. // Powered by CodeProcessor  

■Challenge Phase

撃墜無し.

■Result

oo- +0/-0
429.5pts. 104th
おそらくDiv.1では過去最高の成績です.加えてMediumを解けたのが初めてです.

■Rating

1620 -> 1727
大幅上昇.

0 件のコメント: