ないものは作りましょう。

色々なことに挑戦(主にプログラミング)

JOI 2014-2015 予選

情報オリンピックの結果が発表されました。

結果…300点。落ちました (_ _|||)

1~3問を提出して3完。4,5,6は未提出です。

受かるはずありません。

今回はボーダーが420点でしたのでダメダメでした(笑)

4番のDPが出来なかったのが大きかったかな。5番も時間があれば解けてたし。

DPの練習が足りませんでしたね。

汚いコードですが、提出したものを載せてみます。

1~3問すべてやるだけです。



第一問

#pragma warning( disable: 4996 )
#include <stdio.h>
#include <vector>
using namespace std;

inline int min(int a, int b)
{
    return (a < b ? a : b);
}
inline int max(int a, int b)
{
    return (a > b ? a : b);
}

int main()
{
    int A, B, C, D, P;
    scanf("%d", &A);
    scanf("%d", &B);
    scanf("%d", &C);
    scanf("%d", &D);
    scanf("%d", &P);

    int x = A*P;
    int y = 0;
    if (P <= C) y = B;
    else
    {
        y = B + (P - C)*D;
    }
    int ans = min(x,y);
    printf("%d\n", ans);

    return 0;
}

第二問

#pragma warning( disable: 4996 )
#include <stdio.h>
#include <vector>
using namespace std;

int main()
{
    int N;
    int M;
    scanf("%d", &N);
    scanf("%d", &M);
    
    vector<int> terget(M);
    for (int i = 0; i < M; i++)
    {
        scanf("%d",&terget[i]);
    }

    vector<int> score(N);
    for (int i = 0; i < N; i++)score[i] = 0;

    for (int i = 0; i < M; i++)
    {
        vector<int> vote(N);
        for (int j = 0; j < N; j++)scanf("%d", &vote[j]);

        int miss = 0;
        for (int j = 0; j < N; j++)
        {
            if (vote[j] == terget[i])
            {
                score[j]++;
            }
            else
            {
                miss++;
            }
        }
        score[terget[i] - 1] += miss;
    }

    for (int i = 0; i < N; i++)
    {
        printf("%d\n", score[i]);
    }
    return 0;
}

第三問

#pragma warning( disable: 4996 )
#include <stdio.h>
#include <vector>
using namespace std;

int main()
{
    int H, W;
    scanf("%d %d", &H, &W);

    vector<vector<int>> out(H);
    for (int i = 0; i < H; i++) out[i].resize(W);

    for (int h = 0; h < H; h++)
    {
        char buf[200];
        scanf("%s", buf);

        for (int w = 0; w < W; w++)
        {
            out[h][w] = -1;

            if (buf[w] == 'c')
            {
                out[h][w] = 0;
                continue;
            }

            // 今雲がない
            int c = 0;
            for (int i = w; i >= 0; i--)
            {
                if (buf[i] == 'c')
                {
                    out[h][w] = c;
                    goto next;
                }
                c++;
            }
            // 左に雲がない
            out[h][w] = -1;
            next:;
        }
    }

    for (int i = 0; i < H; i++)
    {
        for (int j = 0;;)
        {
            if (j == W) break;

            printf("%d", out[i][j]);
            j++;
            if (j != W)
            {
                printf(" ");
            }
        }
        printf("\n");
    }
    return 0;
}

本当に無駄が多い。ループを書きすぎてます。

今回の情報オリンピックで競技プログラミングを知ったようなものなので、

これから他のコンテストにも挑戦していきたいと思います。

来年以降JOI予選に出る人は4番の動的計画法の練習をしっかりしておくべきだと思います。


追記
Bランクでも賞状もらえた(T-T)


それでは~