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位である。

Submitted solutions:

code_snippet: // AOJ #2817
// Dance Now! 2025.2.5

#include <bits/stdc++.h>
using namespace std;
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int N; 
    cin >> N;
    
    vector<int> r(N);
    for (int i = 0; i < N; i++) cin >> r[i];
    
    vector<vector<int>> vals(N, vector<int>(3));
    for (int i = 0; i < N; i++){
        for (int d = 0; d < 3; d++) cin >> vals[i][d];
    }
    
    int ans = INT_MAX;
    const int MAX_X = 300;
    
    for (int boostDept = 0; boostDept < 3; boostDept++){
        for (int x = 0; x <= MAX_X; x++){
            vector<int> dsVal(3);
            for (int d = 0; d < 3; d++){
                dsVal[d] = (d == boostDept) ? vals[0][d] + x : vals[0][d];
            }

            int dsOverall = 0;
            for (int d = 0; d < 3; d++){
                int countGreater = 0;
                for (int j = 1; j < N; j++){
                    if (vals[j][d] > dsVal[d])
                        countGreater++;
                }
                int rank = countGreater + 1;
                dsOverall += r[rank - 1];
            }
            
            vector<int> compOverall;
            for (int j = 1; j < N; j++){
                int total = 0;
                for (int d = 0; d < 3; d++){
                    int countGreater = 0;
                    for (int k = 1; k < N; k++){
                        if (k == j) continue;
                        if (vals[k][d] > vals[j][d])
                            countGreater++;
                    }
                    if (dsVal[d] > vals[j][d]) countGreater++;
                    int rank = countGreater + 1;
                    total += r[rank - 1];
                }
                compOverall.push_back(total);
            }

            int betterCount = 0;
            for (int score : compOverall){
                if(score > dsOverall) betterCount++;
            }
            int dsRankOverall = betterCount + 1;
            if(dsRankOverall <= 8){
                ans = min(ans, x);
                break;
            }
        }
    }
    if(ans == INT_MAX) cout << "Saiko" << endl;
    else cout << ans << endl;
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3480
final_rank: 10

code_snippet: #include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int INF = (int)1e9 + 7;
#define rep(i, n) for (int i = 0; i < n; i++)

int n;
vector<int> r;
vector<vector<int>> spc;

bool check() {
    vector<int> total(n);
    for (int k = 0; k < 3; k++) {
        vector<int> rank(n, 0);
        rep(i, n) rep(j, n) if (spc[k][i] < spc[k][j]) rank[i]++;
        rep(i, n) total[i] += r[rank[i]];
    }
    vector<int> rank(n, 0);
    rep(i, n) rep(j, n) if (total[i] < total[j]) rank[i]++;
    return rank[0] <= 8 - 1;
}

int main() {
    while (cin >> n) {
        r.resize(n); spc.assign(3, vector<int>(n));
        rep(i, n) cin >> r[i];
        rep(i, n) cin >> spc[0][i] >> spc[1][i] >> spc[2][i];
        int ans = INF;
        rep(k, 3) for (int p = 1; p <= 100; p++) {
            spc[k][0] += p;
            if (check()) ans = min(ans, p);
            spc[k][0] -= p;
        }
        if (ans == INF) cout << "Saiko" << endl;
        else cout << ans << endl;
    }
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3168
final_rank: 5

code_snippet: #include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int INF = (int)1e9 + 7;

int n;
vector<int> r;
vector<vector<int>> spc;

bool check() {
    vector<int> total(n);
    for (int k = 0; k < 3; k++) {
        vector<int> type_;
        for (int i = 0; i < n; i++) type_.emplace_back(spc[k][i]);
        vector<int> rank(n, 0);
        for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) {
            if (type_[i] < type_[j]) rank[i]++;
        }
        for (int i = 0; i < n; i++) total[i] += r[rank[i]];
    }
    vector<int> rank(n, 0);
    for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) {
        if (total[i] < total[j]) rank[i]++;
    }
    return rank[0] <= 8 - 1;
}

int main() {
    while (cin >> n) {
        r.resize(n); spc.assign(3, vector<int>(n));
        for (int i = 0; i < n; i++) cin >> r[i];
        for (int i = 0; i < n; i++) cin >> spc[0][i] >> spc[1][i] >> spc[2][i];
        int ans = INF;
        for (int k = 0; k < 3; k++) {
            for (int p = 1; p <= 100; p++) {
                spc[k][0] += p;
                if (check()) ans = min(ans, p);
                spc[k][0] -= p;
            }
        }
        if (ans == INF) cout << "Saiko" << endl;
        else cout << ans << endl;
    }
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3168
final_rank: 5

code_snippet: #include <bits/stdc++.h>
#include <sys/time.h>
using namespace std;

#define rep(i,n) for(long long i = 0; i < (long long)(n); i++)
#define repi(i,a,b) for(long long i = (long long)(a); i < (long long)(b); i++)
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define mt make_tuple
#define mp make_pair
template<class T1, class T2> bool chmin(T1 &a, T2 b) { return b < a && (a = b, true); }
template<class T1, class T2> bool chmax(T1 &a, T2 b) { return a < b && (a = b, true); }

using ll = long long; using vll = vector<ll>; using vvll = vector<vll>; using P = pair<ll, ll>;
using ld = long double;  using vld = vector<ld>; 
using vi = vector<int>; using vvi = vector<vi>; vll conv(vi& v) { vll r(v.size()); rep(i, v.size()) r[i] = v[i]; return r; }

inline void input(int &v){ v=0;char c=0;int p=1; while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();} while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();} v*=p; }
template <typename T, typename U> ostream &operator<<(ostream &o, const pair<T, U> &v) {  o << "(" << v.first << ", " << v.second << ")"; return o; }
template<size_t...> struct seq{}; template<size_t N, size_t... Is> struct gen_seq : gen_seq<N-1, N-1, Is...>{}; template<size_t... Is> struct gen_seq<0, Is...> : seq<Is...>{};
template<class Ch, class Tr, class Tuple, size_t... Is>
void print_tuple(basic_ostream<Ch,Tr>& os, Tuple const& t, seq<Is...>){ using s = int[]; (void)s{0, (void(os << (Is == 0? "" : ", ") << get<Is>(t)), 0)...}; }
template<class Ch, class Tr, class... Args> 
auto operator<<(basic_ostream<Ch, Tr>& os, tuple<Args...> const& t) -> basic_ostream<Ch, Tr>& { os << "("; print_tuple(os, t, gen_seq<sizeof...(Args)>()); return os << ")"; }
ostream &operator<<(ostream &o, const vvll &v) { rep(i, v.size()) { rep(j, v[i].size()) o << v[i][j] << " "; o << endl; } return o; }
template <typename T> ostream &operator<<(ostream &o, const vector<T> &v) { o << '['; rep(i, v.size()) o << v[i] << (i != v.size()-1 ? ", " : ""); o << "]";  return o; }
template <typename T> ostream &operator<<(ostream &o, const deque<T> &v) { o << '['; rep(i, v.size()) o << v[i] << (i != v.size()-1 ? ", " : ""); o << "]";  return o; }
template <typename T>  ostream &operator<<(ostream &o, const set<T> &m) { o << '['; for (auto it = m.begin(); it != m.end(); it++) o << *it << (next(it) != m.end() ? ", " : ""); o << "]";  return o; }
template <typename T>  ostream &operator<<(ostream &o, const unordered_set<T> &m) { o << '['; for (auto it = m.begin(); it != m.end(); it++) o << *it << (next(it) != m.end() ? ", " : ""); o << "]";  return o; }
template <typename T, typename U>  ostream &operator<<(ostream &o, const map<T, U> &m) { o << '['; for (auto it = m.begin(); it != m.end(); it++) o << *it << (next(it) != m.end() ? ", " : ""); o << "]";  return o; }
template <typename T, typename U, typename V>  ostream &operator<<(ostream &o, const unordered_map<T, U, V> &m) { o << '['; for (auto it = m.begin(); it != m.end(); it++) o << *it; o << "]";  return o; }
vector<int> range(const int x, const int y) { vector<int> v(y - x + 1); iota(v.begin(), v.end(), x); return v; }
template <typename T> istream& operator>>(istream& i, vector<T>& o) { rep(j, o.size()) i >> o[j]; return i;}
template <typename T, typename S, typename U> ostream &operator<<(ostream &o, const priority_queue<T, S, U> &v) { auto tmp = v; while (tmp.size()) { auto x = tmp.top(); tmp.pop(); o << x << " ";} return o; }
template <typename T> ostream &operator<<(ostream &o, const queue<T> &v) { auto tmp = v; while (tmp.size()) { auto x = tmp.front(); tmp.pop(); o << x << " ";} return o; }
template <typename T> ostream &operator<<(ostream &o, const stack<T> &v) { auto tmp = v; while (tmp.size()) { auto x = tmp.top(); tmp.pop(); o << x << " ";} return o; }
template <typename T> unordered_map<T, ll> counter(vector<T> vec){unordered_map<T, ll> ret; for (auto&& x : vec) ret[x]++; return ret;};
void vizGraph(vvll& g, int mode = 0, string filename = "out.png") { ofstream ofs("./out.dot"); ofs << "digraph graph_name {" << endl; set<P> memo; rep(i, g.size())  rep(j, g[i].size()) { if (mode && (memo.count(P(i, g[i][j])) || memo.count(P(g[i][j], i)))) continue; memo.insert(P(i, g[i][j])); ofs << "    " << i << " -> " << g[i][j] << (mode ? " [arrowhead = none]" : "")<< endl;  } ofs << "}" << endl; ofs.close(); system(((string)"dot -T png out.dot >" + filename).c_str()); }
size_t random_seed; namespace std { using argument_type = P; template<> struct hash<argument_type> { size_t operator()(argument_type const& x) const { size_t seed = random_seed; seed ^= hash<ll>{}(x.fi); seed ^= (hash<ll>{}(x.se) << 1); return seed; } }; }; // hash for various class
struct timeval start; double sec() { struct timeval tv; gettimeofday(&tv, NULL); return (tv.tv_sec - start.tv_sec) + (tv.tv_usec - start.tv_usec) * 1e-6; }
struct init_{init_(){ ios::sync_with_stdio(false); cin.tie(0); gettimeofday(&start, NULL); struct timeval myTime; struct tm *time_st; gettimeofday(&myTime, NULL); time_st = localtime(&myTime.tv_sec); srand(myTime.tv_usec); random_seed = RAND_MAX / 2 + rand() / 2; }} init__;
#define ldout fixed << setprecision(40) 

#define EPS (double)1e-14
#define INF (ll)1e18
#define mo  (ll)(1e9+7)

ll n;
vll r;
bool check(vvll s) {
    vll p(n);
    rep(type, 3) {
        vector<P> t(n);
        rep(i, n) t[i] = P(s[type][i], i);
        sort(all(t));
        reverse(all(t));
        ll prev = -1;
        ll rank = 0;
        rep(i, n) {
            if (prev != t[i].fi) {
                rank = i;
            }
            p[t[i].se] += r[rank];
            prev = t[i].fi;
        }
    }
    ll tmp = p[0];
    sort(all(p));
    return tmp >= p[1];
}

int main(void) {
    cin >> n;
    r.resize(n); cin >> r;
    vvll s(3, vll(n));
    rep(i, n) {
        rep(t, 3)
            cin >> s[t][i];
    }
    check(s);

    ll ret = INF;
    vvll org = s;
    rep(t, 3) rep(x, 1000) {
        ll tmp=s[t][0];
        s[t][0]=x+tmp;
        if (check(s)) chmin(ret, x);
        s[t][0]=tmp;
    }
    if(ret!=INF)
        cout<<ret<<endl;
    else
        cout<<"Saiko"<<endl;

    return 0;
}
accuracy: 0.25
time_ms: 10
memory_kb: 3320
final_rank: 12

code_snippet: #include<bits/stdc++.h>
#define r(i,n) for(int i=0;i<n;i++)
#define fi first
#define se second
using namespace std;
typedef pair<int,int> P;
int n,score[101],a[101][3];
 
 
bool ch(){
 
  int t[101]={},x[101];
  r(i,3){
    int cnt=0,pre,c2=0;
    memset(x,0,sizeof(x));
     
    vector<P> v;
     
    r(j,n)v.push_back(P(a[j][i],j));
     
    sort(v.begin(),v.end(), greater<P>() );
     
    r(k,n){
      if(!k){
    t[v[k].se]+=score[cnt];
    pre=v[k].fi;
      }
      else{
    if(pre==v[k].fi){
      c2++;
      t[v[k].se]+=score[cnt];
    }
    else{
      pre=v[k].fi;
      cnt+=c2+1;c2=0;
      t[v[k].se]+=score[cnt];
    }
      }
    }
     
   }
 
  vector<P> v;
     
  r(j,n)v.push_back(P(t[j],j));
     
  sort(v.begin(),v.end(), greater<P>() );
  int cnt=0,c2=0,pre;
  r(i,n){
    if(!i){
 
      if(!v[i].se&&cnt<=7)return 1;
       
      pre=v[i].fi;
    }
    else{
      if(pre==v[i].fi){
        if(!v[i].se&&cnt<=7)return 1;
        pre=v[i].fi;
        c2++;
      }
       else{
        cnt+=c2+1;c2=0;
        if(!v[i].se&&cnt<=7)return 1;
        pre=v[i].fi;
      }
    }
  }
  return 0;
}
 
 
 
 
int main(){
  cin>>n;
  r(i,n)cin>>score[i];
  r(i,n)r(j,3)cin>>a[i][j];
  r(i,1000)r(j,3){
    a[0][j]+=i;
    if(ch()){
      cout<<i<<endl;
      return 0;
    }
    a[0][j]-=i;
  }
  cout<<"Saiko"<<endl;
}
accuracy: 1
time_ms: 10
memory_kb: 3100
final_rank: 1

code_snippet: #include <bits/stdc++.h>
#define rank asfanf
#define N 101
using namespace std;
typedef pair<int,int> P;
int n,r[N];

map<int,int> mkRank(vector<int> A){
  map<int,int> rank,tmp;
  for(int a:A) rank[-a]++;
  tmp = rank;
  
  for(auto it=rank.begin(),it2=++rank.begin();it2!=rank.end();it++,it2++)
    it2->second += it->second;

  for(P const &p:rank) rank[-p.first] = rank[p.first]-tmp[p.first];
  return rank;
}

int getScore(map<int,int> rank,int a){return r[rank[a]];}

vector<int> calcTotalScore(vector<int> a,vector<int>b,vector<int>c){
  vector<int> res(n,0);
  map<int,int> A = mkRank(a);
  map<int,int> B = mkRank(b);
  map<int,int> C = mkRank(c);
  for(int i=0;i<n;i++) res[i] = getScore(A,a[i]) + getScore(B,b[i]) + getScore(C,c[i]);
  return res;
}

int calc(vector<int> a,vector<int>b,vector<int>c){
  int ans = 1e9;
  for(int i=0;i<200;i++){
    a[0] += i;
    vector<int> total = calcTotalScore(a,b,c);
    map<int,int> rank = mkRank(total);
    //cout<<i<<" "<<rank[total[0]]<<" "<<total[0]<<endl;
    if(rank[total[0]] <= 7) ans = min(ans,i);
    a[0] -= i;
  }
  return ans;
}

int main(){
  cin>>n;
  for(int i=0;i<n;i++) cin>>r[i];
  vector<int> a(n),b(n),c(n);
  for(int i=0;i<n;i++)cin>>a[i]>>b[i]>>c[i];
  
  int ans = min(calc(a,b,c),min(calc(b,a,c),calc(c,a,b)));
  if(ans == 1e9) cout<<"Saiko"<<endl;
  else cout<<ans<<endl;
  return 0;
}
accuracy: 1
time_ms: 740
memory_kb: 3204
final_rank: 11

code_snippet: #include<bits/stdc++.h>
 
using namespace std;
 
#define rep(i, n) for(int i = 0; i < n; i++)
 
int N, R[100];
int S[100], P[100], C[100];
 
 
bool ck()
{
  int pt[101] = {};
 
  vector< pair< int, int > > vs;
  rep(i, N) vs.emplace_back(S[i], i);
  vector< int > rank(N, 0);
  rep(i, N) rep(j, N) if(vs[i].first < vs[j].first) ++rank[vs[i].second];
  rep(i, N) pt[i] += R[rank[i]];
 
  vs.clear();
  rep(i, N) vs.emplace_back(P[i], i);
  rank.assign(N, 0);
  rep(i, N) rep(j, N) if(vs[i].first < vs[j].first) ++rank[vs[i].second];
  rep(i, N) pt[i] += R[rank[i]];
 
  vs.clear();
  rep(i, N) vs.emplace_back(C[i], i);
  rank.assign(N, 0);
  rep(i, N) rep(j, N) if(vs[i].first < vs[j].first) ++rank[vs[i].second];
  rep(i, N) pt[i] += R[rank[i]];
 
  vs.clear();
  rep(i, N) vs.emplace_back(pt[i], i);
  rank.assign(N, 0);
  rep(i, N) rep(j, N) if(vs[i].first < vs[j].first) ++rank[vs[i].second];
 
  return (rank[0] <= 7);
}
 
int main()
{
  cin >> N;
  rep(i, N) cin >> R[i];
  rep(i, N) cin >> S[i] >> P[i] >> C[i];
 
  int ret = 114514;
  rep(i, 101) {
    S[0] += i;
    if(ck()) ret = min(ret, i);
    S[0] -= i;
  }
  rep(i, 101) {
    P[0] += i;
    if(ck()) ret = min(ret, i);
    P[0] -= i;
  }
 
  rep(i, 101) {
    C[0] += i;
    if(ck()) ret = min(ret, i);
    C[0] -= i;
  }
 
  if(ret == 114514) cout << "Saiko" << endl;
  else cout << ret << endl;
}
accuracy: 1
time_ms: 10
memory_kb: 3100
final_rank: 1

code_snippet: #include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define all(a)  (a).begin(),(a).end()
#define pb emplace_back
#define INF (1e9+1)
//#define INF (1LL<<59)
 
int n;
 
bool f(vector<vector<int>> v, vector<int> r){
    map<int,int> mp[3];
    rep(j,3){
        map<int,int> &mpp = mp[j];
        vector<int> tmp;
        rep(i,n){
            tmp.pb(v[i][j]);
        }
        sort(all(tmp));
         
        rep(i,tmp.size()){
            mpp[tmp[i]] = r[i];
        }
    }
     
    vector<pii> s;
    rep(i,n){
        int tmp = 0;
        rep(j,3){
            tmp+=mp[j][v[i][j]];
        }
        s.pb(pii(-tmp,i));
    }
     
    sort(all(s));
     
    int pos=-1;
    rep(i,s.size()){
        if(s[i].second==0){
            pos = i;
            break;
        }
    }
    assert(pos!=-1);
    if(pos<8)return true;
    else return false;
}
 
int main(){
    cin>>n;
    vector<int> r(n);
    rep(i,n)cin>>r[i];
    reverse(all(r));
     
    vector< vector<int> > v(n,vector<int>(3));
    rep(i,n)rep(j,3)cin>>v[i][j];
     
    int ans = INF;
    rep(i,101){
        rep(j,3){
            v[0][j]+=i;
             
            if(f(v,r)){
                ans = min(ans,(int)i);
            }
             
            v[0][j]-=i;
        }
    }
    if(ans==INF)cout<<"Saiko"<<endl;
    else cout<<ans<<endl;
}
accuracy: 1
time_ms: 10
memory_kb: 3172
final_rank: 7

code_snippet: #include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define all(a)  (a).begin(),(a).end()
#define pb emplace_back
#define INF (1e9+1)
//#define INF (1LL<<59)

int n;

bool f(vector<vector<int>> v, vector<int> r){
    map<int,int> mp[3];
    rep(j,3){
        map<int,int> &mpp = mp[j];
        vector<int> tmp;
        rep(i,n){
            tmp.pb(v[i][j]);
        }
        sort(all(tmp));
        
        rep(i,tmp.size()){
            mpp[tmp[i]] = r[i];
        }
    }
    
    vector<pii> s;
    rep(i,n){
        int tmp = 0;
        rep(j,3){
            tmp+=mp[j][v[i][j]];
        }
        s.pb(pii(-tmp,i));
    }
    
    sort(all(s));
    
    int pos=-1;
    rep(i,s.size()){
        if(s[i].second==0){
            pos = i;
            break;
        }
    }
    assert(pos!=-1);
    if(pos<8)return true;
    else return false;
}

int main(){
    cin>>n;
    vector<int> r(n);
    rep(i,n)cin>>r[i];
    reverse(all(r));
    
    vector< vector<int> > v(n,vector<int>(3));
    rep(i,n)rep(j,3)cin>>v[i][j];
    
    int ans = INF;
    rep(i,101){
        rep(j,3){
            v[0][j]+=i;
            
            if(f(v,r)){
                ans = min(ans,(int)i);
            }
            
            v[0][j]-=i;
        }
    }
    if(ans==INF)cout<<"Saiko"<<endl;
    else cout<<ans<<endl;
}
accuracy: 1
time_ms: 10
memory_kb: 3180
final_rank: 8

code_snippet: #include<bits/stdc++.h>

using namespace std;

#define rep(i, n) for(int i = 0; i < n; i++)

int N, R[100];
int S[100], P[100], C[100];


bool ck()
{
  int pt[101] = {};

  vector< pair< int, int > > vs;
  rep(i, N) vs.emplace_back(S[i], i);
  vector< int > rank(N, 0);
  rep(i, N) rep(j, N) if(vs[i].first < vs[j].first) ++rank[vs[i].second];
  rep(i, N) pt[i] += R[rank[i]];

  vs.clear();
  rep(i, N) vs.emplace_back(P[i], i);
  rank.assign(N, 0);
  rep(i, N) rep(j, N) if(vs[i].first < vs[j].first) ++rank[vs[i].second];
  rep(i, N) pt[i] += R[rank[i]];

  vs.clear();
  rep(i, N) vs.emplace_back(C[i], i);
  rank.assign(N, 0);
  rep(i, N) rep(j, N) if(vs[i].first < vs[j].first) ++rank[vs[i].second];
  rep(i, N) pt[i] += R[rank[i]];

  vs.clear();
  rep(i, N) vs.emplace_back(pt[i], i);
  rank.assign(N, 0);
  rep(i, N) rep(j, N) if(vs[i].first < vs[j].first) ++rank[vs[i].second];

  return (rank[0] <= 7);
}

int main()
{
  cin >> N;
  rep(i, N) cin >> R[i];
  rep(i, N) cin >> S[i] >> P[i] >> C[i];

  int ret = 114514;
  rep(i, 101) {
    S[0] += i;
    if(ck()) ret = min(ret, i);
    S[0] -= i;
  }
  rep(i, 101) {
    P[0] += i;
    if(ck()) ret = min(ret, i);
    P[0] -= i;
  }

  rep(i, 101) {
    C[0] += i;
    if(ck()) ret = min(ret, i);
    C[0] -= i;
  }

  if(ret == 114514) cout << "Saiko" << endl;
  else cout << ret << endl;
}
accuracy: 1
time_ms: 20
memory_kb: 3104
final_rank: 3

code_snippet: #define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES

#include "bits/stdc++.h"
#include <random>
using namespace std;
#define rep(i,n) for(int i=0;i<(n);++i)
#define rep2(i,a,b) for(int i=(a);i<(b);++i)
#define rrep(i,n) for(int i=(n)-1;i>=0;--i)
#define rrep2(i,a,b) for(int i=(a)-1;i>=b;--i)
#define range(i,a,b,c) for(int i=a;\
                    c>0?i<b:\
                    i>b;\
                    i+=c)
#define chmax(a, b) (a = (a) < (b) ? (b) : (a))
#define chmin(a, b) (a = (a) > (b) ? (b) : (a))
using ll = long long;
using ull = unsigned long long;
using ld = long double;
#define all(a) begin(a),end(a)
#define ifnot(a) if(not (a))
#define dump(x)  cerr << #x << " = " << (x) << endl
#define int long long
#ifdef _MSC_VER
const bool test = true;
#else 
const bool test = false;
#endif

int dx[] = { 1,0,-1,0 };
int dy[] = { 0,1,0,-1 };
const int INF = 1 << 28;
const ll INFL = (ll)1 << 58;
ll mod = (int)1e9 + 7;
const double eps = 1e-10;
typedef long double Real;
// return -1, 0, 1
int sgn(const Real& r) { return (r > eps) - (r < -eps); }
int sgn(const Real& a, const Real &b) { return sgn(a - b); }

//.....................
const int MAX = (int)2e5 + 5;

vector<string> split(const string &str, char sep) {
	vector<string> v;
	stringstream ss(str);
	string buffer;
	while (getline(ss, buffer, sep)) {
		v.push_back(buffer);
	}
	return v;
}

template<class InputIterator>
int sum(InputIterator begin, InputIterator end) {
	return accumulate(begin, end, 0ll);
}

string reverse_str(string s) {
	reverse(all(s));
	return s;
}

//double dist(double a, double b) {
//	while (ans < 0) ans += 360;
//	while (ans > 360) ans -= 360;
//
//	while (ans < 0) ans += 360;
//	while (ans > 360) ans -= 360;
//}

int N;
int r[MAX];
vector<int> a[3];

void solve() {
	cin >> N;
	rep(i, 3) a[i].resize(N);
	rep(i, N) cin >> r[i];
	rep(i, N) {
		rep(j, 3) {
			cin >> a[j][i];
		}
	}

	int min_cost = INF;
	rep(i, 3) {
		rep(v, 102) {
			vector<pair<int, int>> score(N);
			rep(k, N) score[k].first = 0;
			rep(k, N) score[k].second = k;
			rep(k, 3) {
				vector<pair<int, int>> tmp(N);
				rep(j, N) {
					tmp[j].first = a[k][j];
					tmp[j].second = j;
				}
				if (i == k) tmp[0].first += v;
				map<int, int> m;
				sort(all(tmp), greater<pair<int, int>>());
				rep(j, N) {
					if (m.count(tmp[j].first) == 0) m[tmp[j].first] = j;
					score[tmp[j].second].first += r[m[tmp[j].first]];
				}
			}
			sort(all(score), greater<pair<int, int>>());
			map<int, int> m;
			rep(j, N) {
				if (m.count(score[j].first) == 0) m[score[j].first] = j;
				if (score[j].second == 0 && m[score[j].first] >= 8) {
					goto next;
				}
			}
			chmin(min_cost, v);

			//if (score.back().second != 0
			//	|| score[N-1].first == score[N-2].first) {
			//	//rep(k, N) cout << score[k].first << " ";
			//	//cout << endl;
			//	//dump(i);
			//	//dump(v);
			//	chmin(min_cost, v);
			//	break;
			//}
		next:;
		}
	}
	if (min_cost == INF) cout << "Saiko" << endl;
	else cout << min_cost << endl;
}

signed main() {
	srand(time(NULL));
	int T = (int)1e15;
	solve();
	cout << fixed << setprecision(15);
	rep(i, T) {
		char s[MAX];
		if (scanf("%s", s) == EOF) break;
		int n = strlen(s);
		for (int i = n - 1; i > -1; i--) {
			ungetc(s[i], stdin);
		}
		solve();
	}
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3200
final_rank: 9

code_snippet: #include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
  int n;
  cin>>n;
  int r[n];
  for(int i=0;i<n;i++) cin>>r[i];
  int s[n][3];
  for(int i=0;i<n;i++)
    for(int j=0;j<3;j++)
      cin>>s[i][j];
  int ans=1000;
  for(int j=0;j<3;j++){
    for(int k=1;k<100;k++){
      s[0][j]+=k;
      int sc[n];
      memset(sc,0,sizeof(sc));
      for(int l=0;l<3;l++){
	vector<int> v[1001];
	for(int i=0;i<n;i++)
	  v[s[i][l]].push_back(i);
	
	int ra=0;
	for(int i=1000;i>0;i--){
	  if(v[i].empty()) continue;
	  for(int x=0;x<(int)v[i].size();x++){
	    sc[v[i][x]]+=r[ra];
	  }
	  ra+=v[i].size();
	}
      }
      int ra[1001];
      memset(ra,0,sizeof(ra));
      for(int i=0;i<n;i++){
	ra[sc[i]]++;
      }
      int ran=0;
      for(int i=1000;i>sc[0];i--) ran+=ra[i];
      if(ran<8){
	ans=min(ans,k);
      }
      s[0][j]-=k;
    }
  }
  if(ans<1000) cout<<ans<<endl;
  else cout<<"Saiko"<<endl;
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3112
final_rank: 4