寝癖頭の解法

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

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

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

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

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

・問題 1: 電子レンジ

algo-method.com

/*
C++による「日本情報オリンピック (予選) 過去問」JOI 2016/2017 予選 (前半)の解答例
問題 1: 電子レンジ
https://algo-method.com/tasks/403
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int a,b,c,d,e;
    cin>>a>>b>>c>>d>>e;
    int ans=0;
    if(a<0){
        ans+=c*abs(a);
        ans+=d;
        ans+=b*e;
    }else if(a==0){
        ans+=d;
        ans+=b*e;
    }else{
        ans+=(b-a)*e;
    }
    cout<<ans<<endl;
    return 0;
}
・問題 2: ポイントカード

algo-method.com

/*
C++による「日本情報オリンピック (予選) 過去問」JOI 2016/2017 予選 (前半)の解答例
問題 2: ポイントカード
https://algo-method.com/tasks/404
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int n,m;
    cin>>n>>m;
    vector<int> a(m),b(m);
    for(int i=0;i<m;i++){
        cin>>a[i]>>b[i];
    }
    sort(a.begin(),a.end(),greater<int>());
    int ans=0;
    for(int i=0;i<m-1;i++){
        if(a[i]<n){
            ans+=n-a[i];
        }
    }
    cout<<ans<<endl;
    return 0;
}
・問題 3: 休憩スペース

algo-method.com

/*
C++による「日本情報オリンピック (予選) 過去問」JOI 2016/2017 予選 (前半)の解答例
問題 3: 休憩スペース
https://algo-method.com/tasks/405
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int n,m,d;
    cin>>n>>m>>d;
    char s[n][m];
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>s[i][j];
        }
    }
    int ans=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m-d+1;j++){
            bool tf=false;
            for(int k=j;k<j+d;k++){
                if(s[i][k]=='#'){
                    tf=true;
                    break;
                }
            }
            if(tf==false){
                ans++;
            }
        }
    }
    for(int i=0;i<n-d+1;i++){
        for(int j=0;j<m;j++){
            bool tf=false;
            for(int k=i;k<i+d;k++){
                if(s[k][j]=='#'){
                    tf=true;
                }
            }
            if(tf==false){
                ans++;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

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

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

・A - 電子レンジ (Microwave)

atcoder.jp

・B - ポイントカード (Point Card)

atcoder.jp

・C - 休憩スペース (Refreshment Area)

atcoder.jp