SRM564 DIV2 -Level2

<問題>
①赤のボールの数、緑のボールの数、青のボールの数と1つの整数が与えられる。
②システムは赤のボールがあれば1個壊し、次に緑のボールがあれば1個壊し、次に青のボールがあれば1個壊す。この操作を繰り返す。
③このとき、与えられた整数のターンの時に壊すボールの色を返す。

<解き方>
整数が3つのボールのうち1番小さい数×3以下であれば3で割った余りで色を判別できる。
それ以上であればいったん一番小さい数を除いたあと、2つの色で判定。
そのあとは残りの1色となる。

if文の分岐で記載することもできるが、
ループ処理で書くことによって処理が間違えにくくなる。
色の数を3から減らしていくことと、
1つの色の処理ごとに、配列を詰めていくやり方でコードを書く。

<コード>
class AlternateColors {

public: string getColor(long long r, long long g, long long b, long long k) {
long long c[]={r,g,b};
string name[]={"RED","GREEN","BLUE"};

int t=3;

while(t>1){
long long m=c[0];
FORE(i,1,t)m=min(m,c[i]);
if(k<=m*t)return name[(k-1)%t];
k-=(m*t);

int tmp=t;
t=0;
FORE(i,0,tmp){
if(c[i]-m>0){
c[t]=c[i]-m;
name[t]=name[i];
t++;
}
}

}
return name[0];
}

};
このエントリーをはてなブックマークに追加