将棋とプログラミング

将棋の学習記録とプログラミングの創作記録

AtCoder Beginner Contest 026 B - N重丸

B: N重丸 - AtCoder Beginner Contest 026 | AtCoder

解きました。こういう問題好き。数学系の知識が問われないやつ。私は数学が不得意だから。

ただこの問題は簡単過ぎる。多くのプログラミングコンテストのサイトではこの問題みたいに簡単な問題は簡単過ぎるし、ちょっと難易度が上がるとすぐ数学系の問題になっちゃうから難儀だ。

/***********************************************
大きさの違う円の間の面積の合計を求めるプログラム
入力:円の個数、円の半径を円の個数分だけ
出力:円の間の面積の合計値
***********************************************/
#include<stdio.h>
#include<stdlib.h>

#define PI 3.14159265	/* 円周率 */

int main(){

	int* radius;	/* 円の半径を個数分 */
	int kazu;	/* 円の個数 */
	int i,j;	/* カウンタ */
	int tmp;	/* 一時保存変数 */
	double area = 0.0;	/* 円の面積の合計値 */

	scanf("%d",&kazu);	/* 円の個数を入力 */
	radius = (int*)calloc(kazu,sizeof(int));	/* 円の個数分だけ領域確保 */

	/* 円の半径を入力 */
	for(i=0; i<kazu; i++){
		scanf("%d",radius+i);
	}


	/* 円の半径を降順に並べ替え */
	/* バブルソート */
	for(i=0; i<kazu-1; i++){
		for(j=0; j<kazu-i-1; j++){
			if( radius[j] < radius[j+1] ){
				tmp = radius[j];
				radius[j] = radius[j+1];
				radius[j+1] = tmp;
			}
		}
	}

	/* 円の面積の合計値を求める */
	for(i=0; i<kazu; i++){
		if( i%2 == 0 ){	/* 円を外側から数えて奇数番目だったら */
			if( i != kazu - 1 ){	/* 最後の円じゃなかったら */
				area += ( (double)radius[i] * (double)radius[i] * PI ) - ( (double)radius[i+1] * (double)radius[i+1] * PI );
			}else{
				area += (double)radius[i] * (double)radius[i] * PI;
			}
		}
	}

	printf("%lf\n",area);	/* 出力 */

	return 0;
}