SRM564 Div2 Medium(500) AlternateColors

AlternateColors

1ステップずつ処理していては間に合わないので、まとめる。残りのボールの色数で関数を分けると、簡潔に書ける気がする。

#include <string>
using namespace std;

string solve2( long long c0, long long c1, long long k,
               string n0, string n1 )
{
    long long m = min(c0,c1);
    if ( k<2*m && k%2==0 )  return n0;
    if ( k<2*m && k%2==1 )  return n1;
    if ( c0==m )  return n1;
    if ( c1==m )  return n0;
    return "";
}

string solve3( long long c0, long long c1, long long c2, long long k,
               string n0, string n1, string n2 )
{
    long long m = min(c0,min(c1,c2));
    if ( k<3*m && k%3==0 )  return n0;
    if ( k<3*m && k%3==1 )  return n1;
    if ( k<3*m && k%3==2 )  return n2;
    if ( c0==m )  return solve2( c1-m+1, c2-m+1, k-3*m+2, n1, n2 );
    if ( c1==m )  return solve2( c2-m+1, c0-m,   k-3*m+1, n2, n0 );
    if ( c2==m )  return solve2( c0-m,   c1-m,   k-3*m,   n0, n1 );
    return "";
}

class AlternateColors{public:
string getColor( long long r, long long g, long long b, long long k )
{
    return solve3( r, g, b, k-1, "RED", "GREEN", "BLUE" );
}};