寝癖頭の解法

小学生の目線から、勉強中の覚え書きを投稿、更新していきます。

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

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

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

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

・問題 1: 鉛筆

algo-method.com

/*
C++による「日本情報オリンピック (予選) 過去問」JOI 2017/2018 予選 (前半)の解答例
問題 1: 鉛筆
https://algo-method.com/tasks/400
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int n,a,b,c,d;
    cin>>n>>a>>b>>c>>d;
    int x=0,y=0;
    int n2=n,n3=n;
    while(n2>0){
        n2-=a;
        x+=b;
    }
    while(n3>0){
        n3-=c;
        y+=d;
    }
    cout<<min(x,y)<<endl;
    return 0;
}
・問題 2: 双六

algo-method.com

/*
C++による「日本情報オリンピック (予選) 過去問」JOI 2017/2018 予選 (前半)の解答例
問題 2: 双六
https://algo-method.com/tasks/401
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int n;
    cin>>n;
    int oc=1,ans=1;
    vector<int> a(n);
    for(int i=0;i<n;i++){
        cin>>a[i];
        if(a[i]==1){
            oc++;
        }else{
            oc=1;
        }
        ans=max(ans,oc);
    }
    cout<<ans<<endl;
    return 0;
}
・問題 3: 幹線道路

algo-method.com

/*
C++による「日本情報オリンピック (予選) 過去問」JOI 2017/2018 予選 (前半)の解答例
問題 3: 幹線道路
https://algo-method.com/tasks/402
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int h,w;
    cin>>h>>w;
    vector<vector<int>> a(h,vector<int>(w));
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            cin>>a[i][j];
        }
    }
    int ans=100000000;
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            int sum=0;
            for(int k=0;k<h;k++){
                for(int l=0;l<w;l++){
                    sum+=a[k][l]*min(abs(i-k),abs(j-l));
                }
            }
            ans=min(ans,sum);
        }
    }
    cout<<ans<<endl;
    return 0;
}

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

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

・A - 鉛筆 (Pencils)

atcoder.jp

・B - 双六 (Sugoroku)

atcoder.jp

・C - 幹線道路 (Trunk Road)

atcoder.jp