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();
    }
  }
}

2015年の目標

2014年も残り僅かとなってきたので2015年の目標を

勉強
高専の数学を終わらせる
マクマリー有機化学を読み終える
Forest読み終える

競技
PCK2015の本選に出場して入賞する
AOJ solved数 500

資格
SC/NWを取得
数検1級
TOEIC700
英検2級

というわけで頑張ろうとおもいます
2015年もよろしくお願いします

C++の勉強を始める

やはりできる言語がJavaだけとかいうのは問題なので
C++の勉強を始めようかと思う

というわけでJavaの入門の時もお世話になった柴田望洋先生の本
明解C++入門編を購入しました

冬休み中に全部読めるように頑張ろう(無理)

応用情報技術者試験受験記

一か月前 「申し込んだの忘れてた 本通読しよう」
一週間前 「結局本全然読んでない 過去問しよ」
     「お、ぼちぼちな点数じゃんもう余裕やろ」
当日   「勉強してない落ちたわ」
午前   「まぁこれはできるよな」
午後   「日本語がわからん」

合格発表当日「こわいこわいこわい」
結果
午前得点 91.25点
午後得点 86.00点

過去問で取れてた組み込みとかが難しかったのでつらかったけど
アルゴリズムがとても簡単だったので合格できました。
次は情報セキュリティスペシャリストを目指す

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;
      }
    }
    
  }
  
}