寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

AtCoder Problems in C++ #ioi - 国際情報オリンピック (IOI)

JOI 2010-2011 日本代表選手選考会 (春合宿代替措置) 過去問から、その提出コードの解答例です。
AtCoderとは、コンテストを通じて、プログラミングやアルゴリズムを学習するサービスです。
atcoder.jp
プログラミングコンテストとは、「与えられた問題をいかに素早く、正確に」解くことができるかを競うものです。
競技プログラミング」を略して、「競プロ」などと呼ばれています。

#ioi - 国際情報オリンピック (IOI)

https://www.ioi-jp.org/camp/2011/2011-sp-tasks/2011-sp-day4.pdf

僕が作成、提出したコードは、以下のとおりです。

/*
AtCoder Problems in C++
#ioi - 国際情報オリンピック (IOI)
https://www.ioi-jp.org/camp/2011/2011-sp-tasks/2011-sp-day4.pdf
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int k,n,m;
pair<int,int> p[100000];
vector<int> cer,may;
void output(void){
  sort(cer.begin(),cer.end());
  sort(may.begin(),may.end());
  for(int i=0;i<cer.size();i++){
    cout<<cer[i]+1<<endl;
  }
  cout<<"--------"<<endl;
  for(int i=0;i<may.size();i++){
    cout<<may[i]+1<<endl;
  }
}
int main(void){
  cin>>k>>n>>m;
  for(int i=0;i<k;i++){
    cin>>p[i].first;
    p[i].second=i;
  }
  sort(p,p+k);
  if(n==m){
    int num=p[k-(k+11)/12].first;
    for(int i=0;i<k;i++){
      if(p[i].first>=num){
        cer.push_back(p[i].second);
        may.push_back(p[i].second);
      }
    }
    output();
    return 0;
  }
  for(int i=0;i<k;i++){
    int score=p[i].first-100*(n-m);
    int it=upper_bound(p,p+k,pair<int,int>(score,k))-p;
    int num=k-it-1;
    if(num*12<k){
      cer.push_back(p[i].second);
    }
    score=p[i].first+100*(n-m);
    it=upper_bound(p,p+k,pair<int,int>(score,k))-p;
    num=k-it;
    if(num*12<k){
      may.push_back(p[i].second);
    }
  }
  output();
}