Volume 1 / 0166->0168
パソコン甲子園2007本選 解答
Problem 0166 : Area of Polygon(未)
"Wrong Answer"
円に内接する多角形の面積比較。
多角形は三角形の集合だから、(三角形の面積)=0.5*r*r*sin(v)を足しこめば多角形の面積が出るはず…。
#include <iostream> #include <cmath> #define PI 3.14 using namespace std; int main(void) { int m, n, v, vsum, i; double rad; double s1, s2; while(true){ cin >> m; if( m == 0 ) break; s1 = 0; s2 = 0; vsum = 0; for( i=0; i<m-1; i++ ){ cin >> v; vsum += v; s1 += sin(v*PI/180); } s1 += sin((360-vsum)*PI/180); cin >> n; vsum = 0; for( i=0; i<n-1; i++ ){ cin >> v; vsum += v; s2 += sin(v*PI/180); } s2 += sin((360-vsum)*PI/180); if( s1 > s2 ) cout << 1 << endl; else if( s1 < s2 ) cout << 2 << endl; else cout << 0 << endl; } return 0; }
Problem 0167 : Bubble Sort
バブルソートの交換回数を調べる。
#include <iostream> #include <vector> using namespace std; int bubbleSort( int n, vector<int> vec ) { int cnt, tmp; cnt = 0; for( int i=0; i<n; i++ ){ for( int j=0; j<n-i-1; j++ ){ if( vec[j] > vec[j+1] ){ tmp = vec[j]; vec[j] = vec[j+1]; vec[j+1] = tmp; cnt++; } } } return cnt; } int main(void) { int n, i, input; vector<int> data; while( cin >> n, n != 0 ){ data.clear(); for( i=0; i<n; i++ ){ cin >> input; data.push_back(input); } cout << bubbleSort( n, data ) << endl; } return 0; }
Problem 0168 : Kannondou
【ヒント】
n段目にいたる一歩手前はn-1段目か、n-2段目か、n-3段目のいずれかで、それより下では一足ではn段
目には到達できません。n段目での上り方をanとすると、an は、an-1、an-2、an-3の式で表されますね。(パソコン甲子園公式サイト 2007年本選問題より)
つまり、(n段目)=(n-1段目)+(n-2段目)+(n-3段目)
#include <iostream> using namespace std; int main(void) { int n, cnt, y; int c[31]; c[0] = 1; c[1] = 1; c[2] = 2; for( int i=3; i<=30; i++ ) c[i] = c[i-1] + c[i-2] + c[i-3]; while( cin >> n, n != 0 ){ y = c[n]/(365*10); y += !( c[n]%(365*10) == 0 ); cout << y << endl; } return 0; }