寝癖頭の解法

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

アルゴ式(beta版): C++による「日本情報オリンピック (予選) 過去問」JOI 2015/2016 予選 (前半)の解答例

アルゴ式(beta版)の「日本情報オリンピック (予選) 過去問」JOI 2015/2016 予選 (前半)からの出典です。
algo-method.com
アルゴ式とは...
>・プログラミングや情報科学をコツコツ学べる「教科書」
>・学んだ内容をゲーム感覚で大量に実践できる「練習問題」
>の2つで構成される、Web上で完結した学習コンテンツです。

C++による「日本情報オリンピック (予選) 過去問」JOI 2015/2016 予選 (前半)の解答例

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

・問題 1: 科目選択

algo-method.com

/*
C++による「日本情報オリンピック (予選) 過去問」JOI 2015/2016 予選 (前半)の解答例
問題 1: 科目選択
https://algo-method.com/tasks/408
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    vector<int> four(4);
    vector<int> two(2);
    for(int i=0;i<4;i++){
        cin>>four[i];
    }
    for(int i=0;i<2;i++){
        cin>>two[i];
    }
    sort(four.rbegin(),four.rend());
    sort(two.rbegin(),two.rend());
    int n=four[0]+four[1]+four[2]+two[0];
    cout<<n<<endl;
    return 0;
}
・問題 2: ゼッケンの交換

algo-method.com

/*
C++による「日本情報オリンピック (予選) 過去問」JOI 2015/2016 予選 (前半)の解答例
問題 2: ゼッケンの交換
https://algo-method.com/tasks/409
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int n,m;
    cin>>n>>m;
    vector<int> a(n);
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=m;i++){
        for(int j=0;j<(int)a.size()-1;j++){
            if((a[j]%i)>(a[j+1]%i)){
                using std::swap;
                swap(a[j],a[j+1]);
            }
        }
    }
    for(int i=0;i<n;i++){
        cout<<a[i]<<endl;
    }
    return 0;
}
・問題 3: ロシアの旗

algo-method.com

/*
C++による「日本情報オリンピック (予選) 過去問」JOI 2015/2016 予選 (前半)の解答例
問題 3: ロシアの旗
https://algo-method.com/tasks/410
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int n,m;
    cin>>n>>m;
    vector<int> w(n),b(n),r(n);
    for(int i=0;i<n;i++){
        if(i>=1){
            w[i]=w[i-1];
            b[i]=b[i-1];
            r[i]=r[i-1];
        }
        for(int j=0;j<m;j++){
            char c;
            cin>>c;
            if(c=='W'){
                w[i]++;
            }else if(c=='B'){
                b[i]++;
            }else{
                r[i]++;
            }
        }
    }
    int ans=100000000;
    for(int i=0;i<=n-3;i++){
        for(int j=i+1;j<=n-2;j++){
            ans=min(ans,r[j]+b[i]-b[j]+b[n-1]-w[i]+w[n-1]);
        }
    }
    cout<<ans<<endl;
}

設問の出典は、情報科学をコツコツ積み立てて学習できるサービス「アルゴ式(beta版)」です。
algo-method.com

またAtCoder Problemsにも同じ問題が公開されています。

・A - 科目選択 (Selecting Subjects)

atcoder.jp

・B - ゼッケンの交換 (Swapping Bibs)

atcoder.jp

・C - ロシアの旗 (Russian Flag)

atcoder.jp