久しぶりの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 件のコメント:
コメントを投稿