第35回記念 全国高等学校IT・簿記選手権大会 参加記

移動
特急と新幹線を乗り継ぎ、移動
この時点でだいぶ体力を消費する。
車内で基本情報の過去問道場の午前問題を解く 8~9割正答 微妙か?と思う

大会直前
朝ごはんと昼ごはんをろくに食べておらず(昼ごはんのカロリーメイト1本とモンエナ1本)
体調がすごく悪くなる
同じ教室の高校がとても分厚い過去問のファイルらしきものを持っていてビビる

大会中
<第1部>
SQL表計算でビビる
SQLは2年前のFEの時の知識しかなく、表計算もろくにやったことがない。
しかもまったく知識を使っていないのでうろ覚え
=>爆死

<第2部>
セキュリティとアルゴリズムだったので尿意に耐えながら爆速で解いていく、時間がかなり余った

大会後
一緒に出場したチームメンバーと SQL表計算で死んだわ〜とか話し合う。
帰りの電車までかなり時間があったので、アニメイトに行ったり、電気街に行ってPCパーツとかをみた。

結果
個人4位 第1部33点/第2部47点 80点

感想
過去問がなく、情報0の環境でまぁまぁ健闘できたと思う。
もう参加はできない(留年しなければ)が、問題も入手できたし、来年の後輩の活躍を祈りたい
大会終了後、部の部屋に「功労賞」なるトロフィーが生えていて笑った。

今年の目標 中間報告

もう6月も下旬なので今年の目標の中間報告を

勉強

高専の数学を終わらせる

今3巻の一階微分方程式を勉強している これが終われば二階微分方程式、そして複素平面
統計なので今年中には終わる気がする

マクマリー有機化学を読み終える

進捗出ていない

Forest読み終える

進捗出ていない

競技

PCK2015の本選に出場して入賞する

予選の出場登録をした

AOJ solved数 500

2015/06/20 366問

資格

SC/NWを取得

SC受かりました
受験記 情報セキュリティスペシャリスト受験記 - たわし日和

数検1級

進捗出てない

TOEIC700

TOEIC 530くらいです

英検2級

面接受けないと...(スキー行ってて二次受けられなかった)

その他

病まない

微妙、時たま病むけど本当ひどく病むことは減った気がする
充実していて病む暇がないのかもしれない(謎)

情報セキュリティスペシャリスト受験記

勉強方法

勉強時間は10-20時間程度
過去問道場で午前2の過去問を全問解いた
http://www.amazon.co.jp/dp/4774169374/を一回通読した
午後1、午後2を2年4回分解いた


結果

感想

多分去年の春頃に趣味で暗号技術入門を読んでいたのが前提知識として役に立ったのかもしれない
自己採点を厳しくしすぎた感がある(合格ギリギリと見積もっていた)
秋季はネットワークスペシャリストを受けようと思う。

AOJ 0288 Knocker of the Gigas Cedar

絶対DPの神様が降りてきてる

dp[i][j] i = 木の耐久力 j = 経験値

dp[i][j] = 最小回数

dp[Math.max(0, i - a[k])][Math.min(j + e[k], 100)] = Math.min(dp[Math.max(0, i - a[k])][Math.min(j + e[k], 100)], dp[i][j] + 1);

みたいな感じでDP

import java.util.*;
import java.io.*;
import java.math.*;
public class Main {
  static Scanner sc = new Scanner(System.in);
  static PrintWriter out = new PrintWriter(System.out);
  static int INF = 2 << 25;
  public static void main(String[] args) {
    while(true) {
      int d = sc.nextInt();
      int n = sc.nextInt();
      if(d == 0 && n == 0) break;
      int[] a = new int[n];
      int[] e = new int[n];
      int[] r = new int[n];
      
      for(int i = 0; i < n; i++) {
        a[i] = sc.nextInt();
        e[i] = sc.nextInt();
        r[i] = sc.nextInt();
      }
      
      int[][] dp = new int[d+1][101];
      for(int i = d; i >= 0; i--) {
        Arrays.fill(dp[i], INF);
      }
      dp[d][0] = 0;
      for(int i = d; i >= 0; i--) {
        for(int j = 0; j <= 100; j++) {
          for(int k = 0; k < n; k++) {
            if(j >= r[k]) {
              dp[Math.max(0, i - a[k])][Math.min(j + e[k], 100)] = Math.min(dp[Math.max(0, i - a[k])][Math.min(j + e[k], 100)], dp[i][j] + 1);
            }
          }
        }
      }
      int min = INF;
      for(int i = 0; i < 101; i++) {
        min = Math.min(min, dp[0][i]);
      }
      if(min == INF) {
        System.out.println("NA");
      }
      else {
        System.out.println(min);
      }
      
    }

    
  }
}

Knocker of the Gigas Cedar | Aizu Online Judge

問題出典 PC Koshien 2013 , All-Japan High School Programming Contest, Aizu-Wakamatsu, Japan, 2013-11-9
http://web-ext.u-aizu.ac.jp/pc-concours/

AOJ 0579 Hot days

今日はDPの神が降りてきている
自力で解いた

dp[i][j] iは日数 jは派手さとしてDP

import java.util.*;
import java.io.*;
import java.math.*;
public class Main {
  static Scanner sc = new Scanner(System.in);
  static PrintWriter out = new PrintWriter(System.out);
  public static void main(String[] args) {
    int d = sc.nextInt();
    int n = sc.nextInt();
    int[] t = new int[d];
    for(int i = 0; i < d; i++) {
      t[i] = sc.nextInt();
    }
    int[] a = new int[n];
    int[] b = new int[n];
    int[] c = new int[n];
    for(int i = 0; i < n; i++) {
      a[i] = sc.nextInt();
      b[i] = sc.nextInt();
      c[i] = sc.nextInt();
    }
    
    int[][] dp = new int[d][101];
    for(int i = 0; i < d; i++) {
      Arrays.fill(dp[i], -1);
    }
    for(int i = 0; i < n; i++) {
      if(t[0] >= a[i] && t[0] <= b[i]) {
        dp[0][c[i]] = 0;
      }
    }
    
    for(int i = 1; i < d; i++) {
      for(int j = 0; j < n; j++) {
        if(t[i] >= a[j] && t[i] <= b[j]) {
          for(int k = 0; k < 101; k++) {
            if(dp[i-1][k] != -1) {
              dp[i][c[j]] = Math.max(dp[i-1][k] + Math.abs(k - c[j]), dp[i][c[j]]);
            }
          }
        }
      }
    }
    
    int max = 0;
    for(int i = 0; i < 101; i++) {
      max = Math.max(dp[d-1][i], max);
    }
    System.out.println(max);

    
  }
}

Hot days | Aizu Online Judge

Source: 12th Japanese Olympiad in Informatics, Preliminary Round , 2012-12-16
http://www.ioi-jp.org/

AOJ 0595 Schedule

またまたJOIのDP問題 自力で解けた

dp[i][j] iは何日目か jは出席する人間のBIT
i日目に出席できる組み合わせは i-1日目の組み合わせに依存するので

dp[i][j] = (jとANDをとって0にならず、 かつ 責任者がいる 一日前のjの和)

としてDP

一日目は必ず Jが出席しないといけないことが抜けててバグバグした

import java.util.*;
import java.io.IOException;
import java.math.*;
public class Main {
  static Scanner sc = new Scanner(System.in);

  public static void main(String[] args) {
    int n = sc.nextInt();
    String m = sc.next();
    int[][] dp = new int[n][1 << 3];
    //000 JOI
    for(int i = 0; i < 1 << 3; i++) {
    
    if(B(Integer.toBinaryString(i)).charAt(JOI(m.charAt(0))) == '1' && B(Integer.toBinaryString(i)).charAt(0) == '1') {
      dp[0][i] = 1;
    }
    }
    
    for(int i = 1; i < n; i++) {
    for(int j = 0; j < 1 << 3; j++) {
      if(B(Integer.toBinaryString(j)).charAt(JOI(m.charAt(i))) == '1') {
      for(int k = 0; k < 1 << 3; k++) {
        if((k & j) != 0) {
        dp[i][j] += dp[i-1][k] % 10007;
        }
      }
      }
    }
    }
    int sum = 0;
    for(int i = 0; i < 1 << 3; i++) {
    sum += dp[n-1][i] % 10007;
    }
    System.out.println(sum % 10007);
    
    
    
  }
  
  static int JOI(char a) {
    if(a == 'J') return 0;
    if(a == 'O') return 1;
    return 2;
  }
  
  static String B(String a) {
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < 3- a.length(); i++) {
    sb.append("0");
    }
    sb.append(a);
    return sb.toString();
  }
}

Schedule | Aizu Online Judge

Source: 13th Japanese Olympiad in Informatics, Preliminary Round , 2013-12-15
http://www.ioi-jp.org/

AOJ 0568 Pasta

なんとか自力で解いたDP問題

dp[i][j] i は 何日目 jはパスタの3日分の履歴 3進数として考えた

import java.util.*;
import java.io.IOException;
import java.math.*;
public class Main {
  static Scanner sc = new Scanner(System.in);

  public static void main(String[] args) {
    int n = sc.nextInt();
    int K = sc.nextInt();
    int[] listA = new int[K];
    int[] listB = new int[K];
    for(int i = 0; i < K; i++) {
    listA[i] = sc.nextInt();
    listB[i] = sc.nextInt();
    }
    
    long[][] dp = new long[n][27];
    IN:for(int i = 0; i < n; i++) {
    if(i == 0) {
      for(int j = 0; j < K; j++) {
      if(1 == listA[j]) {
        int k = listB[j]-1;
        dp[0][k] = 1;
        continue IN;
      }
      }
      for(int j = 0; j < 3; j++) {
      dp[0][j] = 1;
      }
      continue IN;
    }
    if(i == 1) {
      for(int j = 0; j < K; j++) {
      if(2 == listA[j]) {
        int tmp = listB[j]-1;
        for(int k = 0; k < 9; k++) {
        if(k % 3 == tmp) {
          dp[1][k] = dp[0][k/3];
        }
        }
        continue IN;
      }
      }
      for(int j = 0; j < 9; j++) {
      dp[1][j] = dp[0][j/3];
      }
      continue IN;
    }
    for(int j = 0; j < K; j++) {
      if(i+1 == listA[j]) {
      for(int k = 0; k < 27; k++) {
        if(k % 3 == listB[j]-1 && !(k%3 == (k%9)/3 && (k%9)/3 == k/9)) {
        dp[i][k] += dp[i-1][(k/9)*3 + (k%9)/3] + dp[i-1][9 + (k/9)*3 + (k%9)/3] + dp[i-1][18 + (k/9)*3 + (k%9)/3];
        dp[i][k] %= 10000;
        }
      }
      continue IN;
      }
    }
    for(int k = 0; k < 27; k++) {
    if(!((k%3) == (k%9)/3 && (k%9)/3 == k/9)) {
      dp[i][k] += dp[i-1][(k/9)*3 + (k%9)/3] + dp[i-1][9 + (k/9)*3 + (k%9)/3] + dp[i-1][18 + (k/9)*3 + (k%9)/3];
      dp[i][k] %= 10000;
    }
    }
    }
    int sum = 0;
    for(int i = 0; i < 27; i++) {
    sum += dp[n-1][i] % 10000;
    sum %= 10000;
    }
    System.out.println(sum);
  }
}