torus711 のアレ

主に競技プログラミングの問題について書きます

SRM 565, Division 2, Level 1 : ValueHistogram

概要

0 〜 9 からなる数列が与えられる。
それぞれの数字の出現数についてのヒストグラムを作成せよ。

解法

適当なやりかたで数えてヒストグラムを作るだけです。
強いて言えば、横向きに作っておいてから行と列を入れ替える方が実装が楽だと思います。

コード

typedef vector<int> VI;
typedef vector<string> VS;

#define REP( i, m, n ) for ( int i = (int)( m ); i < (int)( n ); ++i )
#define ALL( c ) (c).begin(), (c).end()

class ValueHistogram
{
public:
	vector <string> build( vector <int> values )
	{
		VI count( 10, 0 );

		REP( i, 0, values.size() )
		{
			count[ values[i] ] ++;
		}

		int m = *max_element( ALL( count ) );

		VS tmp( 10, string( m + 1, '.' ) );

		REP( i, 0, 10 )
		{
			fill( tmp[i].begin(), tmp[i].begin() + count[i], 'X' );
		}

		VS res( m + 1, string( 10, '.' ) );

		REP( i, 0, tmp.size() )
		{
			REP( j, 0, tmp[i].size() )
			{
				res[j][i] = tmp[i][j];
			}
		}

		reverse( ALL( res ) );

		return res;
	}
];