けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

Chokudai SpeedRun 002 I - カツサンドくん β (400 点)

面白かった

問題へのリンク

問題概要

 N 個ある食べ物から最強の食べ物を決めたい。各食べ物は

  • AP (攻撃力): A_i
  • HP (体力): H_i

からなる。食べ物  i, j

  •  \lceil \frac{H_i}{A_j} \rceil \gt \lceil \frac{H_j}{A_i} \rceil

を満たすとき、 i j より強いという。これらの値が等しい場合は引き分けである。

 N 種類の食べ物のうち最強のもの (他の  N-1 種類すべてを相手に強い) が存在するならそれを答えよ。存在しなければ -1 を出力せよ。

制約

  •  1 \le N \le 2 \times 10^{5}

考えたこと

まずはトーナメントを適当に作ってやらせる。  N-1 回の試合を行う。

これで優勝者を決めて、それが本当に最強かどうかを調べれば OK。

#include <iostream>
#include <vector>
using namespace std;
using pint = pair<int,int>;

bool iswin(long long a, long long b, long long aa, long long ab) {
    if ( (a + ab - 1) / ab > (aa + b - 1) / b) return true;
    else return false;
}

int main() {
    int N;
    cin >> N;
    int mai = -1;
    long long maa = -1, mab = -1;
    vector<long long> a(N), b(N);
    for (int i = 0; i < N; ++i) {
        cin >> a[i] >> b[i];
        if (mai == -1) {
            mai = i;
            maa = a[i];
            mab = b[i];
        }
        else {
            if (iswin(a[i], b[i], maa, mab)) {
                mai = i;
                maa = a[i];
                mab = b[i];
            }
        }
    }
 
    bool allwin = true;
    for (int i = 0; i < N; ++i) {
        if (mai == i) continue;
        if (!iswin(maa, mab, a[i], b[i])) allwin = false;
    }
    if (allwin) cout << mai + 1 << endl;
    else cout << -1 << endl;
}