日々是乃莉

車載システムとかWebに興味があるオタクです

JOI2014-2015(第14回日本情報オリンピック)予選参加記

俺の出来栄え

プロの声

問題毎の感想(全三問)

全問C++で挑みました(それ以外に選択肢がなかった)。

4問目はDPで歯が立たないし5問目は実装に必要な時間が足りなかったのでできませんでした。6問目は見てすらいません。

問題1 水道料金 (Water Rate)

あまり好きではない表現だが、俗にいうやるだけ問題

#include "cstdio"
#include "iostream"
#include "algorithm"
#include "string"
#include "functional"
#define REP(i,n) for(int i=0; i<n; ++i)
using namespace std;
int main(){
    int a,b,c,d,p,x,y,cost;
    cin >> a;
    cin >> b;
    cin >> c;
    cin >> d;
    cin >> p;

    x=a*p;
    if(p<=c) y=b;
    else y=b+d*(p-c);
    cost = min(x,y);
    
    cout << cost << endl;
    return 0;
}

問題2 クリスマスパーティー (Christmas Party)

前年度までの問題と難易度,パターンはほぼ変わらず。

手続き型言語であれば、条件分岐と繰り返しが理解できていれば解けると思う。

ここまで完答すればBランクです。

#include "cstdio"
#include "iostream"
#include "algorithm"
#include "string"
#include "functional"
#define REP(i,n) for(int i=0; i<n; ++i)
using namespace std;
int main(){
    int n,m;
    cin >> n; cin >> m;

    int target[m],friends[n],score[n];
    REP(i,n) score[i] = 0;
    REP(i,m) cin >> target[i];

    REP(i,m){

        REP(z,n) cin >> friends[z];

        REP(j,n){
            if(friends[j] == target[i]) score[j] += 1;
            else score[target[i]-1] += 1;
        }
    }

    REP(i,n) cout << score[i] << '\n';
    return 0;
}


問題3 気象予報士 (Weather Forecaster)

平面座標を利用した問題であることは昨年度と共通。しかしスーパー易化。

問題文にもあったように、空白の出力に注意。

#include "cstdio"
#include "iostream"
#include "algorithm"
#include "string"
#include "functional"
#define REP(i,n) for(int i=0; i<n; ++i)
using namespace std;
int main(){
    int h,w;
    cin >> h >> w;
    char sky[w];
    int after_sky[w];
    REP(i,h){
        REP(z,w){
            sky[z] = 0;
            after_sky[z] = 0;
        }
        REP(z,w){
            cin >> sky[z];
        }
        REP(j,w){
            if(sky[j] == 'c'){
                after_sky[j] = 0;
            }else{
                for(int k=j; k>=0; --k){
                    if(sky[k] == 'c'){
                        after_sky[j] = j-k;
                        break;
                    }else{
                        after_sky[j] = -1;
                    }
                }
            }
        }
        REP(z,w){
            if(z == w-1) cout << after_sky[z] << '\n';
            else cout << after_sky[z] << '\0';
        }
    }
    return 0;
}

最後に

俺はこれでしばらく競技プログラミングをしなくなってしまう(大会前もしていなかっただろ)と思います。サポートして下さった皆様、ありがとうございました。