パソコン甲子園2007予選 3点問題(基礎)
2007.09.28 01:07 パソコン甲子園 2007
パソコン甲子園2007予選問題
問題01 キャンディーとクラス旗
概要
n個のキャンディがあり、これらを39人の生徒が順番に1個ずつ取っていく。生徒は3C01から3C39までの生徒番号をそれぞれもち、最後のキャンディを取った生徒番号を出力せよ。
解法
キャンディの数を生徒の数で割った余りを計算し対応する生徒番号を出力します。
ただし、キャンディの数が生徒数で割り切れる場合は、最後の生徒番号を出力することに注意が必要です。
サンプルプログラム
問題02 視力検査
概要
複数の人の視力検査の結果を入力として、視力判定表に基づいて各判定にあてはまる人数を左右の視力別に出力せよ。
解法
各判定A, B, C, Dにおける左右の該当人数を保持する4×2の整数型配列を用意し、
分岐処理によって人数をカウントしていきます。
サンプルプルグラム
問題03 双子素数
概要
n以下の双子素数(差が2となる素数の組)で最大のものを出力せよ。
解法
エラトステネスの篩などで素数表Tをつくり、入力nから5に向かってT[i] と T[i-2] が共に素数かどうかを調べます。
サンプルプログラム
問題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) | ↑ページトップ |