全埋めしました Blurとか辛かった。枝刈りゲーこわい。
AOJ 2590 Unknown Switches
Unknown Switches | Aizu Online Judge
AOJ-ICPCの200問題
めっちゃ悩んだ つらかった
問題要約
電源スイッチの操作状況 S (オンオフではなく、スイッチの状態を変えたか)と電球が点灯しているかどうか B が与えられる
電源スイッチと電球の対応を出力せよ
電源スイッチとの対応関係が分かる電球の場合、対応する電源スイッチの番号を出力し
電源スイッチとの対応関係が不明な電球の場合、「?」と出力せよ
解法
電源スイッチと電球の対応表を作り、
電源スイッチの状態(オンかオフか)と電球の状態(点灯しているかしていないか)が食い違う場合、電源スイッチと電球が対応していないと記録する
電源スイッチと電球の対応が1対1に定まるとき該当の電源スイッチの番号を出力し、
定まらない場合は「?」を出力する
さてこんなわけのわからないたわし語を用いたたわしの説明よりスライドを見た方が早い
というわけでこちらが公式の解説スライドです
http://acm-icpc.aitea.net/index.php?plugin=attach&refer=2014%2FPractice%2F%E6%A8%A1%E6%93%AC%E5%9C%B0%E5%8C%BA%E4%BA%88%E9%81%B8%2F%E8%AC%9B%E8%A9%95&openfile=B.pdf
import java.util.*; public class Main { public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); while(true) { int n = stdIn.nextInt(); int m = stdIn.nextInt(); int q = stdIn.nextInt(); if(n == 0 && m == 0 && q == 0) break; String[] S = new String[q]; String[] B = new String[q]; for(int i = 0; i < q; i++) { S[i] = stdIn.next(); B[i] = stdIn.next(); } boolean[][] SX = new boolean[q][n]; boolean[][] BX = new boolean[q][m]; for(int i = 0; i < q; i++) { for(int j = 0; j < n; j++) { SX[i][j] = (S[i].charAt(j) == '1')?true:false; } for(int j = 0; j < m; j++) { BX[i][j] = (B[i].charAt(j) == '1')?true:false; } if(i != 0) { for(int j = 0; j < n; j++) { SX[i][j] = (S[i].charAt(j) == '1')?!SX[i-1][j]:SX[i-1][j]; } for(int j = 0; j < m; j++) { BX[i][j] = (B[i].charAt(j) == '1')?true:false; } } } boolean[][] list = new boolean[n][m]; for(int i = 0; i < q; i++) { for (int j = 0; j < n; j++) { if (SX[i][j]) { for (int k = 0; k < m; k++) { if (!BX[i][k]) { list[j][k] = true; } } } if (!SX[i][j]) { for (int k = 0; k < m; k++) { if (BX[i][k]) { list[j][k] = true; } } } } } if(n == 1) { for(int i = 0; i < m; i++) { System.out.print(0); } System.out.println(); continue; } int[] ans = new int[m]; for(int i = 0; i < m; i++) { ans[i] = -1; int count = 0; int id = 0; for(int j = 0; j < n; j++) { if(!list[j][i]) { id = j; count++; } } if(count == 1) { ans[i] = id+1; } } for(int i = 0; i < ans.length; i++) { if(ans[i] == -1) { System.out.print("?"); } else if(ans[i] <= 10) { char a = '0'; a += ans[i]-1; System.out.print(a); } else { char a = 'A'; a += (ans[i] - 11); System.out.print(a); } } System.out.println(); } } }
応用情報技術者試験受験記
一か月前 「申し込んだの忘れてた 本通読しよう」
一週間前 「結局本全然読んでない 過去問しよ」
「お、ぼちぼちな点数じゃんもう余裕やろ」
当日 「勉強してない落ちたわ」
午前 「まぁこれはできるよな」
午後 「日本語がわからん」
合格発表当日「こわいこわいこわい」
結果
午前得点 91.25点
午後得点 86.00点
過去問で取れてた組み込みとかが難しかったのでつらかったけど
アルゴリズムがとても簡単だったので合格できました。
次は情報セキュリティスペシャリストを目指す
パソコン甲子園2014プログラミング部門本戦 参加記
3AC1WA
精進します
AOJ 0202 At Boss's Expenseを解く
dpやな
dpはできんな
でもこれ簡単なdpじゃね
あっ
→WA
なんでや!完璧やろ!
あっ 1も含むのね 頭バグってた
→AC
import java.util.*; public class Main { public static int[] val; public static int n; public static int x; public static boolean[] dp; public static int[] PrimeTable; public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); while (true) { n = stdIn.nextInt(); x = stdIn.nextInt(); if(n == 0 && x == 0) { break; } val = new int[n]; for (int i = 0; i < n; i++) { val[i] = stdIn.nextInt(); } dp = new boolean[x + 1]; PrimeTable = new int[x + 1]; dp(); createPrimeTable(x); Arrays.sort(PrimeTable); int ans = 0; for (int i = x ; i >= 1; i--) { if (dp[i] && Arrays.binarySearch(PrimeTable, i) >= 0) { ans = i; break; } } if (ans != 0) { System.out.println(ans); } else { System.out.println("NA"); } } } public static void dp() { dp[0] = true; for(int i = 0; i < n; i++) { for(int j = 0; j <= x; j++) { if(dp[j] == true) { if(j + val[i] <= x) { dp[j + val[i]] = true; } } } } } public static void createPrimeTable(int x) { //xまでの素数テーブルを作成 boolean[] isPrime = new boolean[x+1]; for(int i = 2; i < x+1; i++) { isPrime[i] = true; } int counter = 0; for(int i = 2; i < Math.sqrt(x+1); i++) { if(isPrime[i]) { for(int j = i * 2; j < x+1; j += i) { isPrime[j] = false; } } } for(int i = 0; i < x+1; i++) { if(isPrime[i]) { PrimeTable[counter++] = i; } } } }