fc2ブログ



パソコン甲子園2007予選 3点問題(基礎)

2007.09.28 01:07  パソコン甲子園 2007

パソコン甲子園2007予選問題

問題01 キャンディーとクラス旗

概要

n個のキャンディがあり、これらを39人の生徒が順番に1個ずつ取っていく。生徒は3C01から3C39までの生徒番号をそれぞれもち、最後のキャンディを取った生徒番号を出力せよ。

解法

キャンディの数を生徒の数で割った余りを計算し対応する生徒番号を出力します。
ただし、キャンディの数が生徒数で割り切れる場合は、最後の生徒番号を出力することに注意が必要です。

サンプルプログラム

001 #include<iostream>
002 using namespace std;
003 
004 main(){
005     static const int nstudent = 39;
006     int ncandy, target;
007     cin >> ncandy;
008     target = ncandy % nstudent;
009     if ( target == 0 ) target = nstudent;
010     cout << "3C";
011     if ( target < 10 ) cout << "0";
012     cout << target << endl;
013 }



問題02 視力検査

概要

複数の人の視力検査の結果を入力として、視力判定表に基づいて各判定にあてはまる人数を左右の視力別に出力せよ。

解法

各判定A, B, C, Dにおける左右の該当人数を保持する4×2の整数型配列を用意し、
分岐処理によって人数をカウントしていきます。

サンプルプルグラム

001 #include<iostream>
002 using namespace std;
003 #define A 0
004 #define B 1
005 #define C 2
006 #define D 3
007 #define LEFT 0
008 #define RIGHT 1
009 
010 main(){
011     int T[4][2];
012     for ( int i = 0; i < 4; i++ ) T[i][0] = T[i][1] = 0;
013     double left, right;
014     while( cin >> left >> right ){
015         if ( 1.1 <= left) T[A][LEFT]++;
016         if ( 1.1 <= right) T[A][RIGHT]++;
017         if ( 0.6 <= left && left < 1.1 ) T[B][LEFT]++;
018         if ( 0.6 <= right && right < 1.1 ) T[B][RIGHT]++;
019         if ( 0.2 <= left && left < 0.6 ) T[C][LEFT]++;
020         if ( 0.2 <= right && right < 0.6 ) T[C][RIGHT]++;
021         if ( left < 0.2 ) T[D][LEFT]++;
022         if ( right < 0.2 ) T[D][RIGHT]++;
023     }
024     
025     for ( int i = 0; i < 4; i++ ) {
026         cout << T[i][0] << " " << T[i][1] << endl;
027     }
028 }



問題03 双子素数

概要

n以下の双子素数(差が2となる素数の組)で最大のものを出力せよ。

解法

エラトステネスの篩などで素数表Tをつくり、入力nから5に向かってT[i] と T[i-2] が共に素数かどうかを調べます。

サンプルプログラム

001 #include<iostream>
002 using namespace std;
003 
004 #define LIMIT 10000
005 
006 void eratos ( int n, bool prime[]){
007     for ( int i = 0; i <= n; i++ ) prime[i] = false;
008     for ( int i = 3; i <= n; i += 2 ) prime[i] = true;
009     prime[2] = true;
010     int limit = (int)sqrt((double)n) + 1;
011     for ( int i = 3; i <= limit; i += 2 ){
012         if ( !prime[i] ) continue;
013         for ( int j = i + i; j <= n; j += i ) prime[j] = false;
014     }
015 }
016 
017 bool prime[LIMIT+1];
018 
019 void compute( int n ){
020     int i;
021     for ( i = n; i >= 5; i-- ){
022         if ( prime[i] && prime[i-2] ) break;
023     }
024     cout << i - 2 << " " << i << endl;
025 }
026 
027 main(){
028     eratos(LIMIT, prime);
029     int n;
030     while ( cin >> n, n) compute(n);
031 }


スポンサーサイト



テーマ : プログラミング - ジャンル : コンピュータ

| コメント(0) | トラックバック(0) | ↑ページトップ |

この記事へのコメント

コメントを書く


管理人にのみ表示

↑ページトップ

この記事へのトラックバック

この記事にトラックバックする(FC2ブログユーザー)

↑ページトップ