0159-The Best Boy

http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=0159&lang=jp
実数の取り扱いに割と苦労した。

問題概要
複数の生徒の生徒番号・体重・身長が与えられるので、最もBMIが22に近い生徒の生徒番号を出力するという問題。

考え方
与えられた生徒の情報を、BMIの22との差及び生徒番号でソートする。
ソート後の第一要素が答えとなる。

実装(C++/インクルード省略)

struct body{
	int i;
	double bmi;
};
int cmpbody(const body *a,const body *b){
	if(a->bmi > b->bmi){
		return 1;
	} else if(a->bmi < b->bmi){
		return -1;
	} else return a->i-b->i;
}
int main(){
	int n;
	int i;double h,w;
	for(;;){
		scanf("%d",&n);
		if(n==0)return 0;
		body d[n];
		for(int j=0;j<n;j++){
			scanf("%d %lf %lf",&i,&h,&w);
			h/=100;
			d[j].i=i;
			d[j].bmi=fabs(22.0-w/(h*h));
		}
		qsort(d,n,sizeof(body),(int(*)(const void*,const void*))cmpbody);
		printf("%d\n",d[0].i);
	}

	return 0;
}