寝癖頭の解法

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

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

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

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

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

・問題 1: 宿題

algo-method.com

/*
C++による「日本情報オリンピック (予選) 過去問」JOI 2012/2013 予選 (前半)の解答例
問題 1: 宿題
https://algo-method.com/tasks/587
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
  int l,a,b,c,d;
  cin>>l>>a>>b>>c>>d;
  int math=(a%c==0 ? a/c : a/c+1);
  int japanese=(b%d==0 ? b/d : b/d+1);
  int ans=l-max(math,japanese);
  cout<<ans<<endl;
  return 0;
}
・問題 2: 数当てゲーム

algo-method.com

/*
C++による「日本情報オリンピック (予選) 過去問」JOI 2012/2013 予選 (前半)の解答例
問題 2: 数当てゲーム
https://algo-method.com/tasks/588
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
  int n;
  cin>>n;
  vector<vector<int>> vv(n,vector<int>(3));
  for(int i=0;i<n;i++){
    for(int j=0;j<3;j++){
      cin>>vv[i][j];
    }
  }
  vector<int> score(n,0);
  for(int j=0;j<3;j++){
    for(int i=0;i<n;i++){
      bool tf=true;
      for(int k=i+1;k<n;k++){
        if(vv[i][j]==vv[k][j]){
          tf=false;
          break;
        }
      }
      for(int k=0;k<i;k++){
        if(vv[i][j]==vv[k][j]){
          tf=false;
          break;
        }
      }
      if(tf){
        score[i]+=vv[i][j];
      }
    }
  }
  for(int i=0;i<n;i++){
    cout<<score[i]<<endl;
  }
  return 0;
}
・問題 3: 看板

algo-method.com

/*
C++による「日本情報オリンピック (予選) 過去問」JOI 2012/2013 予選 (前半)の解答例
問題 3: 看板
https://algo-method.com/tasks/589
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
  int n;
  string s;
  cin>>n>>s;
  int ss=(int)s.size();
  vector<string> vs(n);
  int cnt=0;
  for(int i=0;i<n;i++){
    cin>>vs[i];
    int vss=(int)vs[i].size();
    for(int j=0;j<vss;j++){
      for(int k=1;k*(ss-1)+j<vss;k++){
        for(int l=0;l<ss;l++){
          if(vs[i].at(j+l*k)!=s[l]){
            goto one;
          }
        }
        cnt++;
        goto two;
        one:;
      }
    }
    two:;
  }
  cout<<cnt<<endl;
  return 0;
}

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