読者です 読者をやめる 読者になる 読者になる

備忘録

書きたい時に書きたい文だけ

JOI予選に参加した話

皆さんJOI予選お疲れ様でした。

私は今年が2回目の参加で、上手く進級できればこれが最後になります。

出来としては、冗談とかなしに予選落ちです。

何故なら3問目までしか解いてない、かつ合ってるのは2問目までだからです。

はい、まあそんな奴が書く振り返り的な記事なので参考にはならないと思って軽い気持ちでゆるく今回も読んでいただけると幸いです。

ソースコードも載せるのでコードレビューとかしていただけると死ぬほど喜びます。

集合

あれだけアドベントカレンダーに書かれていた(書いていた)のにも関わらず遅刻者がいましたねぇ...
意識が低すぎて悲しくなりますね。

(予選前にイラっとしていたのはここだけの話)

予選

1問目

所謂やるだけ問題。

ただ問題見落としてしまってAが0の時というのも入れてしまってアという感じでした。

#include<stdio.h>
int main(void)
{
    int a,b,c,d,e,x=0;
    scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
    if(a<0){
        x += (0-a)*c;
        x += d;
        x += b*e;
    }
    if(a==0){
        x += d;
        x += b*e;
    }
    if(a>0){
        x = (b-a)*e;
    }
    printf("%d\n",x);
    return 0;
}
2問目

あたりが交換できる数まであるカードだけ除外して、
それ以外のカードをあたりでソートしてっていうやり方が簡単で頭が良いやり方だと思うんですけど、自分は頭が悪すぎて何故かはずれの方でソートしてごちゃごちゃやるっていう方法でしてしまいました。頭悪いですね。

#include<stdio.h>
int main(void)
{
    int n,m,i,j,a[2000],b[2000],x,tmp,cnt=0,y=0;
    scanf("%d%d",&n,&m);
    for(i=0;i<m;i++){
        scanf("%d%d",&a[i],&b[i]);
    }
    for(i=0;i<m;i++){
        for(j=i+1;j<m;j++){
            if(a[i]>=n&&b[i]>b[j]){
                tmp = b[i];
                b[i] = b[j];
                b[j] = tmp;
                tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
        }
        if(a[i]>=n) cnt++;
    }
    if(cnt==m-1) printf("0\n");
    if(cnt<m-1){
        for(i=0;i<n;i++){
           if(cnt==m-1) break;
           else{
            if(a[i]<n){
            y += n-a[i];
            cnt++;
            }
           }
        }
        printf("%d\n",y);
    }
    return 0;
}
3問目

問題の3問目ですね。

なんか取り敢えず当てはまる場合だけを数えようとおもってやってました。

サンプルは通ったので行けると思ったんですけど無理でしたね。

後から提出していたのを見直してみたらテストケースの3つ目が0になってておかしいな?と思って聞いたら案の定間違ってました。

多分というか確実にやり方がまずかったんでしょうね。

そんな感じで書いたコードはこちらになります。
(他のに比べたら汚いですが許してください...)

#include<stdio.h>
int main(void)
{
    int n,m,i,j,d,cnt[100],x=0,l;
    char c[100][100];
    scanf("%d %d %d",&n,&m,&d);
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            scanf(" %c",&c[i][j]);
        }
    }
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
                cnt[j]=0;
            if(j+d<=m){
                for(l=j;l<j+d;l++){
                    if(c[i][l]=='.') cnt[j]++;
                }
        if(cnt[j]==d){
                x++;
        }
        }
    }
    }
    for(j=0;j<m;j++){
        for(i=0;i<n;i++){
            cnt[i]=0;
            if(i+d<=n){
                for(l=i;l<i+d;l++){
                    if(c[j][l]=='.') cnt[i]++;
                }
        if(cnt[i]==d){
         x++;
        }
        }
    }
    }
    printf("%d\n",x);
    return 0;
}

反省と感想

3問目は多分もっと問題解いてれば解けたと思うので悔しいです。

部内模擬予選あたりから今日まで競プロ楽しいなって思えたのは良かったと思います。

もうJOIには出れませんが他の競プロのコンテストとかには積極的に参加したいなと思いました。

(アルフォートを食べながら飲むコーヒーは最高でした)


来年や、本選に出られる方は悔いのないように頑張ってください。

陰ながらですが応援してます。

改めて、皆さんお疲れさまでした。

良い結果が出ることを祈ります。

ではでは。


(追記 12/15)
結果出ましたね。

通過した方はおめでとうございます。

私の結果はと言いますと、もちろん予選落ちでした。

2問目まではあってるつもりでいたんですが、テストケースの1つ目までしか合ってませんでした。

とても今辛いです。

Bランクまではいきたかったです。

とても辛いです。

この記事を見ている今後もJOIに出れる方々はこんな風にならないようにやるべき事をやることをオススメします。

私みたいに終ってから死にたいくらいに辛くならないように。

予選通過した方々は、本選も頑張ってください。

健闘をお祈りします。