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; }