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
import java.util.*;
import java.math.*;
import java.lang.*;

public class ChickenOracle{
public String theTruth(int n, int eggCount, int lie, int liar){
int e=eggCount;
int c=n-eggCount;

boolean ef=false;
boolean cf=false;

for(int i=0;i<=lie;i++){
int l1=i;
int l2=lie-l1;
int e1=e-l1;
int c1=c-l2;
if(e1<0||c1<0)
continue;
e1+=l2;
c1+=l1;
if(e1==liar) cf=true;
if(c1==liar) ef=true;
}

if(cf&&ef) return "Ambiguous";
else if(cf)return "The chicken";
else if(ef)return "The egg";
else return "The oracle is a lie";
}
}


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

■Result
○×× 50 -25
100.0p

■Rating
1282 -> 1339

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

0 件のコメント: