結果
問題 | No.769 UNOシミュレータ |
ユーザー | YukimotoPG |
提出日時 | 2019-03-11 15:00:04 |
言語 | Java21 (openjdk 21) |
結果 |
AC
|
実行時間 | 349 ms / 2,000 ms |
コード長 | 4,406 bytes |
コンパイル時間 | 2,615 ms |
コンパイル使用メモリ | 79,268 KB |
実行使用メモリ | 66,356 KB |
最終ジャッジ日時 | 2024-11-22 09:16:43 |
合計ジャッジ時間 | 8,095 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 82 ms
37,740 KB |
testcase_01 | AC | 81 ms
38,156 KB |
testcase_02 | AC | 100 ms
39,680 KB |
testcase_03 | AC | 105 ms
38,584 KB |
testcase_04 | AC | 119 ms
39,732 KB |
testcase_05 | AC | 104 ms
38,288 KB |
testcase_06 | AC | 112 ms
39,552 KB |
testcase_07 | AC | 93 ms
38,304 KB |
testcase_08 | AC | 94 ms
38,300 KB |
testcase_09 | AC | 149 ms
41,840 KB |
testcase_10 | AC | 152 ms
41,812 KB |
testcase_11 | AC | 158 ms
41,844 KB |
testcase_12 | AC | 214 ms
48,680 KB |
testcase_13 | AC | 212 ms
48,668 KB |
testcase_14 | AC | 205 ms
48,716 KB |
testcase_15 | AC | 282 ms
57,480 KB |
testcase_16 | AC | 275 ms
56,364 KB |
testcase_17 | AC | 284 ms
57,632 KB |
testcase_18 | AC | 334 ms
62,064 KB |
testcase_19 | AC | 349 ms
66,356 KB |
testcase_20 | AC | 320 ms
62,408 KB |
testcase_21 | AC | 347 ms
65,824 KB |
testcase_22 | AC | 92 ms
38,272 KB |
ソースコード
import java.util.*; import java.io.*; public class Main { void solve (FastScanner in, PrintWriter out) { int n = in.nextInt(), m = in.nextInt(); String[] turn = in.nextArray(m); int next = 0; //次は誰の番か int[] num = new int[n]; //i番目の人がカードを何枚置いたか int[] draw = new int[n]; //i番目の人がカードを何枚引いたか boolean reverse = false; //順番の方向(reverseが置かれるたびに変化) int draw2Num = 0; //drawtwoが場に何枚蓄積されているか int draw4Num = 0; //drawfourが場に何枚蓄積されているか for (int i=0; i<m; i++) { //next番目の人がカードを置く num[next]++; //最後の人がカードを置いた場合、そこで終了なのでループを抜ける if (i == m-1) break; if (turn[i].equals("drawtwo")) { draw2Num += 2; //場へ蓄積させる //次の人が最後の人でなく、かつ、置いた札が"drawtwo"でない場合、 //その人の一つ前の人に蓄積した"drawtwo"を引かせる if (i!=m-1 && !turn[i+1].equals("drawtwo")) { //次の人へターンを回す関数 next = nextTurn(next, 1, n, reverse); draw[next] += draw2Num; draw2Num = 0; } next = nextTurn(next, 1, n, reverse); } else if (turn[i].equals("drawfour")) { //"drawtwo"と同じ draw4Num += 4; if (i!=m-1 && !turn[i+1].equals("drawfour")) { next = nextTurn(next, 1, n, reverse); draw[next] += draw4Num; draw4Num = 0; } next = nextTurn(next, 1, n, reverse); } else if (turn[i].equals("skip")) { next = nextTurn(next, 2, n, reverse); //移動量を2にする } else if (turn[i].equals("reverse")) { reverse = reverse==true? false : true; //方向を逆転 next = nextTurn(next, 1, n, reverse); } else { //通常のターン移行 next = nextTurn(next, 1, n, reverse); } } out.println((next+1)+" "+(num[next]-draw[next])); } static int nextTurn (int now, int move, int num, boolean b) { int result = 0; if (b == true) { return Math.max(now-move, (now-move+num)%num); } else { return Math.min(now+move, (now+move)%num); } } public static void main(String[] args) { FastScanner in = new FastScanner(System.in); PrintWriter out = new PrintWriter(System.out); Main main = new Main(); main.solve(in, out); in.close(); out.close(); } static class FastScanner { private InputStream in; private byte[] buffer = new byte[1024]; private int length = 0, p = 0; public FastScanner (InputStream stream) { in = stream; } public boolean hasNextByte () { if (p < length) return true; else { p = 0; try {length = in.read(buffer);} catch (Exception e) {e.printStackTrace();} if (length <= 0) return false; } return true; } public int readByte () { if (hasNextByte() == true) return buffer[p++]; return -1; } public boolean isPrintable (int n) {return 33<=n&&n<=126;} public void skip () { while (hasNextByte() && !isPrintable(buffer[p])) p++; } public boolean hasNext () {skip(); return hasNextByte();} public String next () { if (!hasNext()) throw new NoSuchElementException(); StringBuilder sb = new StringBuilder(); int t = readByte(); while (isPrintable(t)) { sb.appendCodePoint(t); t = readByte(); } return sb.toString(); } public String[] nextArray (int n) { String[] ar = new String[n]; for (int i=0; i<n; i++) ar[i] = next(); return ar; } public int nextInt () {return Math.toIntExact(nextLong());} public int[] nextIntArray (int n) { int[] ar = new int[n]; for (int i=0; i<n; i++) ar[i] = nextInt(); return ar; } public long nextLong () { if (!hasNext()) throw new NoSuchElementException(); boolean minus = false; int temp = readByte(); if (temp == '-') { minus = true; temp = readByte(); } if (temp<'0' || '9'<temp) throw new NumberFormatException(); long n = 0; while (isPrintable(temp)) { if ('0'<=temp && temp<='9') { n *= 10; n += temp - '0'; } else throw new NumberFormatException(); temp = readByte(); } return minus? -n : n; } public double nextDouble () { return Double.parseDouble(next()); } public void close () { try {in.close();} catch(Exception e){} } } }