Volume 5 / 0510->0514

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

Problem 0510 : Score / 得点

足して、大きいほうを表示するだけ。

#include <iostream>

using namespace std;


int main(void)
{
	int s, t, i, input;

	s = t = 0;
	for( i=0; i<4; i++ ){
		cin >> input;
		s += input;
	}
	for( i=0; i<4; i++ ){
		cin >> input;
		t += input;
	}

	cout << ( ( s > t ) ? s : t ) << endl;

	return 0;
}

Problem 0511 : Who Are The Student Yet To Submit / 未提出者は誰だ

人数分の配列を用意して、提出済…true, 未提出…falseとする。

#include <iostream>

using namespace std;


int main(void)
{
	int i, num;
	bool student[30];

	for( i=0; i<30; i++ )
		student[i] = false;

	for( i=0; i<28; i++ ){
		cin >> num;
		student[num-1] = true;
	}

	for( i=0; i<30; i++ )
		if( !student[i] )
			cout << i+1 << endl;

	return 0;
}

Problem 0512 : Caesar Cipher / シーザー暗号

3文字ずらしてみて、Aより文字が若くなってしまったらその分をZから戻す。

#include <iostream>

using namespace std;


int main(void)
{
	char ch;

	while( cin.get(ch), ch != '\n' ){
		ch -= 3;
		if( ch < 'A' )
			ch = 'Z' - ( 'A' - ch ) + 1;
		cout << ch;
	}
	cout << endl;

	return 0;
}

Problem 0513 : Shuffle The Cards / カードの並び替え

vectorを使えば添え字をあまり気にしないで操作できる。問題文に指定されている順番通りにカードを積んでいくだけ。

#include <iostream>
#include <vector>

using namespace std;


vector<int> op1( vector<int> cards, int k )
{
	int i;
	vector<int> result;

	for( i=k; i<cards.size(); i++ )
		result.push_back(cards[i]);
	for( i=0; i<k; i++ )
		result.push_back(cards[i]);

	return result;
}

vector<int> op2( vector<int> cards, int n )
{
	int i;
	vector<int> result;

	for( i=0; i<n; i++ ){
		result.push_back(cards[i]);
		result.push_back(cards[n+i]);
	}

	return result;
}

int main(void)
{
	int n, m, k, i;
	vector<int> cards;

	cin >> n;
	for( i=0; i<2*n; i++ )
		cards.push_back(i+1);

	cin >> m;
	for( i=0; i<m; i++ ){
		cin >> k;
		if( k )
			cards = op1( cards, k );
		else
			cards = op2( cards, n );
	}

	for( i=0; i<2*n; i++ )
		cout << cards[i] << endl;

	return 0;
}

Problem 0514 : Quality Checking / 品質検査(未提出)

「正常2・不明1のパーツを検査して結果が不合格ならば、その不明の部品は故障である」ということになる。
だから、とりあえず合格の部品だけ調べて、あとから不合格になった検査のみをチェックするだけで解けるっぽい。

#include <iostream>
#include <vector>

using namespace std;


struct EXAM {
	int part[3];
	int result;
};

void calc( vector<int> parts, vector<EXAM> exam )
{
	int i, j, cnt, n;

	for( i=0; i<exam.size(); i++ ){
		cnt = 0;
		for( j=0; j<3; j++ ){
			if( parts[exam[i].part[j]-1] != 1 ){
				cnt++; n = exam[i].part[j]-1;
			}
		}
		if( cnt == 1 )
			parts[n] = 0;
	}

	for( i=0; i<parts.size(); i++ )
		cout << parts[i] << endl;

	return;
}

int main(void)
{
	int a, b, c, n, r, i;
	vector<int> parts;
	vector<EXAM> exam;
	EXAM tmp;

	while( cin >> a >> b >> c, a!=0, b!=0, c!=0 ){
		parts.clear(); exam.clear();
		parts.resize( a+b+c, 2 );

		cin >> n;
		for( i=0; i<n; i++ ){
			cin >> tmp.part[0] >> tmp.part[1] >> tmp.part[2] >> tmp.result;

			if( tmp.result )
				parts[tmp.part[0]-1] = parts[tmp.part[1]-1] = parts[tmp.part[2]-1] = 1;
			else
				exam.push_back(tmp);
		}

		calc( parts, exam );
	}

	return 0;
}