見出し画像

ABC064-C 備忘録 p.10

itsukiです。
AtCoderの過去問を解いた様子です。解説記事ではありません。

考察の流れ

bitで管理したら良さそうな気がする
0-3199 まで 8種類のレートを bit に割り当てて、何色あるかカウントする
別途 3200 以上の人数をカウントする
色の種類数が最小:3200以上が全員、規定レート色を選んだ場合
色の種類数が最大:3200以上が全員、規定レート色にない色をバラバラに選んだ場合
char a=0;
int  bit;
~
if	   (m < 400){ bit=0; }
else if(m < 800){ bit=1; }
else if(m <1200){ bit=2; }
~
else if(m <3200){ bit=7; }
~
a |= (1<<(bit));
↑ みたいに書いたけど、もっと短く書けそう
途中で「全員が3200以上だった場合」を考慮していなかったことに気づく
→ 最小値は 1
//bit 0:灰, 1:茶, 2:緑, 3:水, 4:青, 5:黄, 6:橙, 7:赤
#include <stdio.h>
int main(){
    int n,m,cnt=0,outside=0;
    char a=0;
    scanf("%d",&n);
    for(int i=0; i<n; i++){
        scanf("%d",&m);
        if( m >= 3200 ){ outside++; }
        else{ a |= (1<<(m/400)); }
    }
    for(int bit=0; bit<8; bit++){
        if( (a >> bit) & 1 ){ cnt++; }
    }
    //最小
    if( cnt==0 ){ printf("%d ",   1); }
    else	    { printf("%d ", cnt); }
    //最大
    printf("%d\n", cnt+outside);
    return 0;
}

まとめ

・bit を扱うのが楽しい
・if ~ if else を短く書けたのが嬉しい

引き続き、のんびり精進します。

#note初心者 #備忘録 #AtCoder #ABC #競技プログラミング #競プロ #数学   #C言語 #bit

この記事が気に入ったらサポートをしてみませんか?