結果
問題 | No.257 N言っちゃダメゲーム (3) |
ユーザー |
![]() |
提出日時 | 2015-11-18 02:35:08 |
言語 | PHP (843.2) |
結果 |
AC
|
実行時間 | 101 ms / 2,000 ms |
コード長 | 3,082 bytes |
コンパイル時間 | 1,261 ms |
コンパイル使用メモリ | 32,020 KB |
実行使用メモリ | 49,272 KB |
平均クエリ数 | 3.70 |
最終ジャッジ日時 | 2024-07-16 21:46:13 |
合計ジャッジ時間 | 6,244 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 30 |
コンパイルメッセージ
No syntax errors detected in Main.php
ソースコード
<?php // ルールを拡張して正整数 N と K を使って以下のゲームを考える。 // 1. まず先攻のプレイヤーは 0 が与えられる。 // 2. そこから N 以上を宣言しないように(宣言したら負けになる)与えられた整数に 1~K のどれかの整数を加算したものを宣言し相手プレイヤーに渡す。 // 3. 勝負がつくまで代わり代わりに 2. を繰り返す。 // 実際にGrantと対戦し勝利してください。 // 最初にN,K が与えられ、 // あなたは、先攻後攻どちらかを自由に選べる。 // 時間の都合上、相手は、5ターン連続で勝てる見込みがないと判断すると諦めることになっている。 // 相手が諦めた場合、ゲームの状態には関係なくN以上(N+K以下の数)が宣言される。これは相手が諦めたものであると解釈し、あなたの勝ちとし、プログラムを終了すること // 入出力 // 最初の一行を読み込むと、ゲームのN,Kの値が得られる。 // N K // N,Kは整数で与えられる。 // 1≤N≤108 // 1≤K≤108 // 続いて、後攻を選択する場合のみ // 0 // を出力してください。 // 先攻の場合、何もしなくてよい。 // 自分のターンの時に、宣言する整数を1つ出力してください。 // A // これ以外の形式、ゲームのルールに違反する整数を宣言した場合の結果は、不定となる。 // 相手のターンの時は、相手の宣言した整数を標準入力として読み込む。形式は1つの整数である。ゲームのルール上あり得る整数値が渡される。 // B // 入力を読み込むと、自分のターンになり上記の繰り返しとする。 // この時に、N以上の入力を読み込んだとき、ただちにプログラムを終了してください。 $input=explode(' ',trim(fgets(STDIN))); solve(intval($input[0]),intval($input[1])); function solve($countOfDead,$maxAdd) { $current = 0; // countOfDead-1を取得した方が勝利と思われる // また、それを取得するには、countOfDead-1-maxAdd-1を取得できればよく、 // そこから公式化すると、countOfDead-1-(maxAdd+1)*nを取得した方が勝利 // 0より大きい中でcountOfDead-1-(maxAdd+1)*nの一番小さいものをプレイヤーが取得できる方を選べば勝てる $winNumber = $countOfDead-1; $minWinNumber = $winNumber % ($maxAdd+1); if( $minWinNumber!=0 && $minWinNumber <= $maxAdd ) { // 先攻ならば勝利 $current += $minWinNumber; } else { // 後攻ならば勝利 } //currentを出力 print($current.PHP_EOL); // あとは、ひたすらcountOfDead-1-(maxAdd+1)*nをキープ while(1) { $input = trim(fgets(STDIN)); $readNum=intval($input); if( $countOfDead <= $readNum) { // 勝利で終了 return; } // currentを更新 $current = $readNum; $minWinNumber = ($winNumber-$current) % ($maxAdd+1); $current += $minWinNumber; print($current.PHP_EOL); } }