Volume 5 / 0500->0502

情報オリンピック 2006予選 解答

Problem 0500 : Card Game

問題通りに実装するだけ。

#include <iostream>

using namespace std;


int main(void)
{
	int n, point_a, point_b, a, b;

	while( cin >> n, n!=0 ){
		point_a = point_b = 0;

		for( int i=0; i<n; i++ ){
			cin >> a >> b;
			if( a == b ){
				point_a += a;
				point_b += b;
			} else if( a > b ){
				point_a += a + b;
			} else {
				point_b += a + b;
			}
		}

		cout << point_a << " " << point_b << endl;
	}

	return 0;
}

Problem 0501 : Data Conversion

map使って変換。

#include <iostream>
#include <map>

using namespace std;


int main(void)
{
	int n, m, i;
	char x, y, input;
	map< char, char > table;


	while( cin >> n, n!=0 ){
		table.clear();

		for( i=0; i<n; i++ ){
			cin >> x >> y;
			table.insert( pair<char,char>( x, y ) );
		}

		cin >> m;
		for( i=0; i<m; i++ ){
			cin >> input;
			if( table[input] )
				cout << table[input];
			else
				cout << input;
		}

		cout << endl;

	}

	return 0;
}

Problem 0502 : Dice

"サイコロの向かいあう面の和は必ず7である"を利用するとサイコロの状態を保存する配列は3つで済む(添字の関係で4つにしたけれど)。
そうすると回転処理が楽チン。

#include <iostream>
#include <string>

using namespace std;


void turn( int num[4], int a, int b )
{
	int tmp;

	tmp = num[a];
	num[a] = num[b];
	num[b] = 7-tmp;

	return;
}

int main(void)
{
	int n, i, sum;
	int num[4];
	string str;


	while( cin >> n, n!=0 ){
		sum = 1;
		for( i=0; i<=3; i++ )
			num[i] = i;

		for( i=0; i<n; i++ ){
			cin >> str;

			if( str == "North" )
				turn( num, 1, 2 );
			if( str == "East" )
				turn( num, 3, 1 );
			if( str == "West" )
				turn( num, 1, 3 );
			if( str == "South" )
				turn( num, 2, 1 );
			if( str == "Right" )
				turn( num, 2, 3 );
			if( str == "Left" )
				turn( num, 3, 2 );

			sum += num[1];

		}

		cout << sum << endl;
	}

	return 0;
}