Problem:
B: だんすなうwww - Dance Now! -

物語

前回のラボライフ！ダイガクイン！！
マスターアイドルたちが競う最大の大会「ラボライフ」の前哨戦ともいえるイベント「マスターアイドルワールド」で9位を取ってしまったドサンコスノー。
キレのあるダンスは「9位の舞」、渾身の決めポーズも「9位の構え」などと冷やかされてしまい、心に深い傷を負ってしまう。
来たるラボライフ予備予選では絶対に9位をとるわけにはいかない……
決意を新たにしたドサンコスノーは、自分たちの特技「セルフコントロール」に磨きをかけ、決戦の地へと向かうのだった。

問題

N組のユニットが競う大会「ラボライフ」が開かれる。
この大会では、スマイル・ピュア・クールの3つの部門で別々に勝負が行われ、それぞれの勝負で得た得点の合計が高い順に総合順位が決定される。
スマイル部門の順位はそれぞれのユニットが持つスマイル値の値が高い順に決定される。
ピュア・クール部門でも同様にピュア値・クール値が高い順に順位が決定される。
順位に応じた得点設定は全部門で共通しており、ある部門でi位のユニットは、その部門ではr_i点を得る。

ここで、順位がi位のユニットと同じ値を持つユニットが複数ある場合、それらは同率i位とみなし、等しく得点r_iを得る。
より詳細には、kユニットが同率i位の場合には、kユニットが等しく得点r_iを得て、r_{i+1}からr_{i+k-1}までの得点を得るユニットはいない。
また、その次に値が大きいユニット (たち) は得点r_{i+k}を得る。
具体的な例として、例えばそれぞれスマイル値が1, 3, 2, 3, 2の5つのユニットがあり、順位が高い順に10, 8, 6, 4, 2点が得られる場合を考える。
このとき、2番目と4番目のユニットが10点、3番目と5番目のユニットが6点、1番目のユニットが2点を得ることになる。

ラボライフ予備予選に参加するユニット・ドサンコスノーは「ラボライフは遊びじゃない」と考えているため、真っ先に大会にエントリーし、1番目のユニットとなった。
しかし、大会に参加するN組すべてのスマイル値・ピュア値・クール値 (以降3値と呼ぶ) の情報を入手したところ、自分たちの総合順位が (同率) 9位であることがわかった。
ドサンコスノーは特技「セルフコントロール」により3値のうちいずれか1つの値を任意の値だけ上昇させることができるが、あまり上げすぎると疲れてしまい本戦に影響するので、できるだけ上昇値を小さくしたい。
ドサンコスノーはとにかく9位を脱したいので、同率8位以上になるようにセルフコントロールによって3値のいずれか1値を上げるとき、上げる必要のある最小の値を求めよ。

入力形式

入力は以下の形式で与えられる。

N
r_1 ... r_N
s_1 p_1 c_1
...
s_N p_N c_N

1行目はユニットの数を表す整数Nが1行で与えられる。
続く2行目はN個の整数が空白区切りで与えられる。i (1 \leq i \leq N) 番目の整数は各部門で順位がi位だったときに貰える得点r_iを表す。
続くN行目のうち、j行目には3つの整数s_j, p_j, c_jが与えられる。これらはそれぞれj番目のユニットのスマイル値s_j、ピュア値p_j、クール値c_jを表す。
なおドサンコスノーは1番目のユニットであるとする。

制約

9 \leq N \leq 100

100 \geq r_1 > ... > r_N \geq 1

1 \leq s_j, p_j, c_j \leq 100 (1 \leq j \leq N)

セルフコントロールする前、ドサンコスノーは9位 (同率9位の場合はあるが、同率8位以上であることはない)

出力形式

セルフコントロールによって3値のどれかをxだけ上げることでドサンコスノーが同率8位以上になるような最小のxを1行に出力せよ。ただし、セルフコントロールによってどの値をどれだけ上げても順位が上げられない場合は "Saiko" と出力せよ。

入力例1

9
9 8 7 6 5 4 3 2 1
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9

出力例1

2

例えばセルフコントロールでスマイル値を2だけ上げると、ドサンコスノーの各部門における順位はそれぞれ同率7位、9位、9位となり、3+1+1 = 5点を得る。一方、2番目のユニットの各部門における順位はそれぞれ9位、8位、8位となり、1+2+2 = 5点を得る。他のユニットは6点以上を獲得するため、この2つのユニットが同率8位となり、条件を満たす。

入力例2

9
9 8 7 6 5 4 3 2 1
1 1 1
2 6 9
6 9 2
9 2 6
3 5 8
5 8 3
8 3 5
4 7 4
7 4 7

出力例2

Saiko

どの値をどれだけ上げてもドサンコスノーは11点までしか得ることができないが、他のユニットは必ず14点以上を得ることができるため、ドサンコスノーは不動の9位である。

Solution in JAVA (judge verdict: Accepted)

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Comparator;
import java.util.NoSuchElementException;

public class Main {

  int N;
  int[] R;
  int[][] spc;

  private boolean ok(int x, int pos) {
    spc[0][pos] += x;

    int[][] points = new int[N][2];
    for (int team = 0; team < 3; team++) {

      int[][] tmp = new int[N][2];
      for (int i = 0; i < N; i++) {
        tmp[i][0] = spc[i][team];
        tmp[i][1] = i;
      }

      Arrays.sort(tmp, new Comparator<int[]>() {
        @Override
        public int compare(int[] o1, int[] o2) {
          return o2[0] - o1[0];
        }
      });

      int rank = 0;
      for (int i = 0; i < N; i++) {
        if (i > 0 && tmp[i][0] != tmp[i - 1][0]) {
          rank = i;
        }
        int unit = tmp[i][1];
        points[unit][0] += R[rank];
        points[unit][1] = unit;
      }
    }

    Arrays.sort(points, new Comparator<int[]>() {
      @Override
      public int compare(int[] o1, int[] o2) {
        if (o1[0] == o2[0]) {
          return o1[1] - o2[1];
        }
        return o2[0] - o1[0];
      }
    });

    spc[0][pos] -= x;
    for (int i = 0; i < N; i++) {
      if (points[i][1] == 0) {
        return i < 8;
      }
    }
    throw new IllegalArgumentException();
  }

  private void solve(FastScanner in, PrintWriter out) {
    N = in.nextInt();
    R = in.nextIntArray(N);
    spc = new int[N][3];
    for (int i = 0; i < N; i++) {
      spc[i][0] = in.nextInt();
      spc[i][1] = in.nextInt();
      spc[i][2] = in.nextInt();
    }

    int min = 10000;
    for (int pos = 0; pos < 3; pos++) {
      for (int i = 0; i < 200; i++) {
        if (ok(i, pos)) {
          min = Math.min(min, i);
          break;
        }
      }
    }
    if (min == 10000) {
      out.println("Saiko");
      return;
    }

    out.println(min);
  }

  public static void main(String[] args) {
    PrintWriter out = new PrintWriter(System.out);
    new Main().solve(new FastScanner(), out);
    out.close();
  }

  private static class FastScanner {

    private final InputStream in = System.in;
    private final byte[] buffer = new byte[1024];
    private int ptr = 0;
    private int bufferLength = 0;

    private boolean hasNextByte() {
      if (ptr < bufferLength) {
        return true;
      } else {
        ptr = 0;
        try {
          bufferLength = in.read(buffer);
        } catch (IOException e) {
          e.printStackTrace();
        }
        if (bufferLength <= 0) {
          return false;
        }
      }
      return true;
    }

    private int readByte() {
      if (hasNextByte()) {
        return buffer[ptr++];
      } else {
        return -1;
      }
    }

    private static boolean isPrintableChar(int c) {
      return 33 <= c && c <= 126;
    }

    private void skipUnprintable() {
      while (hasNextByte() && !isPrintableChar(buffer[ptr])) {
        ptr++;
      }
    }

    boolean hasNext() {
      skipUnprintable();
      return hasNextByte();
    }

    public String next() {
      if (!hasNext()) {
        throw new NoSuchElementException();
      }
      StringBuilder sb = new StringBuilder();
      int b = readByte();
      while (isPrintableChar(b)) {
        sb.appendCodePoint(b);
        b = readByte();
      }
      return sb.toString();
    }

    long nextLong() {
      if (!hasNext()) {
        throw new NoSuchElementException();
      }
      long n = 0;
      boolean minus = false;
      int b = readByte();
      if (b == '-') {
        minus = true;
        b = readByte();
      }
      if (b < '0' || '9' < b) {
        throw new NumberFormatException();
      }
      while (true) {
        if ('0' <= b && b <= '9') {
          n *= 10;
          n += b - '0';
        } else if (b == -1 || !isPrintableChar(b)) {
          return minus ? -n : n;
        } else {
          throw new NumberFormatException();
        }
        b = readByte();
      }
    }

    double nextDouble() {
      return Double.parseDouble(next());
    }

    double[] nextDoubleArray(int n) {
      double[] array = new double[n];
      for (int i = 0; i < n; i++) {
        array[i] = nextDouble();
      }
      return array;
    }

    double[][] nextDoubleMap(int n, int m) {
      double[][] map = new double[n][];
      for (int i = 0; i < n; i++) {
        map[i] = nextDoubleArray(m);
      }
      return map;
    }

    public int nextInt() {
      return (int) nextLong();
    }

    public int[] nextIntArray(int n) {
      int[] array = new int[n];
      for (int i = 0; i < n; i++) {
        array[i] = nextInt();
      }
      return array;
    }

    public long[] nextLongArray(int n) {
      long[] array = new long[n];
      for (int i = 0; i < n; i++) {
        array[i] = nextLong();
      }
      return array;
    }

    public String[] nextStringArray(int n) {
      String[] array = new String[n];
      for (int i = 0; i < n; i++) {
        array[i] = next();
      }
      return array;
    }

    public char[][] nextCharMap(int n) {
      char[][] array = new char[n][];
      for (int i = 0; i < n; i++) {
        array[i] = next().toCharArray();
      }
      return array;
    }

    public int[][] nextIntMap(int n, int m) {
      int[][] map = new int[n][];
      for (int i = 0; i < n; i++) {
        map[i] = nextIntArray(m);
      }
      return map;
    }
  }
}