2010年9月10日金曜日

TopCoder Member SRM 481

SRM 481(9/9 20:00~22:00)

久しぶりのSRM.今回は,とりあえずEasy正答を目標に.

■ChickenOracle(Div1 Easy)

□Problem
あなたは,"卵が先か鶏が先か"問題の答えを知りたい.そんな時oracleは現れた.
しかし,あなたがどんなに尋ねても,oracleは答えを教えてくれない.その代わり,n人には既に答えを教えた"という.そこであなたは,そのn人に答えを尋ねてみたところ,eggCount人は"卵が先だ"と言い,残りのn-eggCount人は"鶏が先だ"と言う.困ったあなたはもう一度oracleに尋ねたところ,"lieCount人には嘘の答えを教えた.更にliarCount人は,あなたに(oracleが教えた)答えと反対の答えを言った"とのこと.これらの情報から,oracleの本当の答えを推測せよ.
返り値
"卵が先" -> "The egg"
"鶏が先" -> "The chicken"
どちらもあり得る -> "Ambiguous"
どちらもありえない -> "The oracle is a lie"

場合分けを沢山すれば解けるとは思うのですが,難しかったので,愚直にループを回しました.しかし,↓の回答に辿りつくまでに2回もResubmitしてしまった為,Scoreが75.0pになってしまいました.

□Code
  1. import java.util.*;  
  2. import java.math.*;  
  3. import java.lang.*;  
  4.   
  5. public class ChickenOracle{  
  6.     public String theTruth(int n, int eggCount, int lie, int liar){  
  7.         int e=eggCount;  
  8.         int c=n-eggCount;  
  9.   
  10.         boolean ef=false;  
  11.         boolean cf=false;  
  12.           
  13.         for(int i=0;i<=lie;i++){  
  14.             int l1=i;  
  15.             int l2=lie-l1;  
  16.             int e1=e-l1;  
  17.             int c1=c-l2;  
  18.             if(e1<0||c1<0)  
  19.                 continue;  
  20.             e1+=l2;  
  21.             c1+=l1;  
  22.             if(e1==liar) cf=true;  
  23.             if(c1==liar) ef=true;  
  24.         }  
  25.           
  26.         if(cf&&ef) return "Ambiguous";  
  27.         else if(cf)return "The chicken";  
  28.         else if(ef)return "The egg";  
  29.         else       return "The oracle is a lie";  
  30.     }  
  31. }  


■Challenge
一人,自分が陥っていたミスと同様のことをしていた人がいたので撃墜(+50).
もう一人,間違ってそうだからとチャレンジしたが撃墜失敗(-25).

■Result
○×× 50 -25
100.0p

■Rating
1282 -> 1339

とりあえず1300まで上昇.どうにか次回もRatingを上げたいものです.

0 件のコメント: