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 を短く書けたのが嬉しい
引き続き、のんびり精進します。