[BOJ]196-新入社員


https://www.acmicpc.net/problem/1946
質問する
いつでも最高の大企業陣営の株式会社だけを求めて新入社員募集を実施する.人材選抜試験は第1回書類審査と第2回面接からなる.最高の企業理念だけを追求し、最も優秀な人材を従業員として選抜したいと考えています.
そのため、珍栄株式会社は、他のすべての応募者に比べて、書類審査成績と面接成績のうち少なくとも1人が他の応募者を下回らないという原則を制定した.つまり、ある応募者Aの成績が他の応募者Bの成績に比べて書類審査の結果も面接の成績も低下すれば、Aは絶対に選ばれないということです.
これらの条件を満たす場合は、珍栄株式会社が今回の新入社員募集で選抜できる新入社員の最大人数を要求する計画を立ててください.
入力
第1行は、試験例の個数T(1≦T≦20)を与える.各試験例の最初の行は、ボランティアの数N(1≦N≦100000)を与えた.2行目からN行目では、応募者ごとの書類審査成績、面接成績の順位が空白で1行になっています.どちらの成績順も1位からN位までは上下しないと仮定している.
しゅつりょく
各テストケースについて、珍栄株式会社は新入社員の最大人数を1行1行印刷することができます.
サンプルI/O
入力
  • 例1
  • 2
    5
    3 2
    1 4
    4 1
    2 3
    5 5
    7
    3 6
    7 3
    4 2
    1 4
    5 7
    2 5
    6 1
  • 例出力1
  • 4
    3
    Solution
    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    
    int main(){
        int T;
        cin >> T;
        for(int i = 0 ; i < T; i++){
            int N;
            cin >> N;
            vector<pair<int, int>> Vec;
            for(int j = 0; j < N; j++){
                int doc, meet;
                cin >> doc >> meet;
                Vec.push_back({doc, meet});
            }
            sort(Vec.begin(), Vec.end());
            int Answer = 1;
            int tmp = Vec[0].second;
            for(int j = 1; j < Vec.size(); j++){
                if(Vec[j].second < tmp){
                    Answer++;
                    tmp = Vec[j].second;
                    if(tmp == 1) break;
                }
            }
            cout << Answer << '\n';
        }
    }
    カスタム基準に基づいてソートする方法には、さまざまな言語がサポートされています.主言語がどんな言語であろうと、あなたはその方法を使いますか.これは問い合わせの質問です.
    つまり、ある応募者Aの成績が他の応募者Bの成績に比べて書類審査の結果も面接の成績も低下すれば、Aは絶対に選ばれないということです.
    まずファイル基準に従ってソートします.
    この文章を読んでいる人は、ある程度C++の基本文法は理解できると思います.文書成績と面接成績の2つのデータは、pair形式のvectorで受信される.すなわち,前のfirstデータに基づいてソートする.
    ファイルの成績が低い順に並んでいるのかもしれません.その後,最初のデータの面接成績を基準に線形探索を開始する.
    sort(Vec.begin(), Vec.end());
    int Answer = 1;
    int tmp = Vec[0].second;
    for(int j = 1; j < Vec.size(); j++){
    	if(Vec[j].second < tmp){
        	Answer++;
        	tmp = Vec[j].second;
        	if(tmp == 1) break;
    	}
    }
    cout << Answer << '\n';
    書類が一番低い人より面接の成績が低い人がいると、淘汰者が現れます.その時点で、淘汰者の面接点数を基準に探索を続け、点数が1の2クラスを見つけたら失敗する.どうせいくら探しても1より低い人はいない.
    整列さえすれば解けます.ただ、どのような基準で並べ替えられているのか分からない問題です.
    import sys; input = lambda : sys.stdin.readline().rstrip()
    T = int(input())
    while(T>0):
        N = int(input())
        data = sorted([list(map(int, input().split())) for i in range(N)], key = lambda x : x[0])
        count = 1
        min = data[0][1]
    
        for i in range(1, N):
            if data[i][1] < min:
                min = data[i][1]
                count += 1
        print(count)
        T -= 1
    Pythonで問題を解決するにはこのように解決しなければならない.実際,ソート時にコードのみを考慮すれば,残りは実現できる.