問題
List of Top 3 Hills
山や丘の高さをメートル単位で 1 から 10,000 までの範囲の整数で表した 10 個のデータがあります。その 10 個のデータを読み込んで、その中で、高い順から3つ出力して終了するプログラムを作成して下さい。
Input
山の高さ1(整数)
山の高さ2(整数)
.
.
山の高さ10(整数)
Output
最も高い山の高さ
2番目に高い山の高さ
3番目に高い山の高さ
Sample Input
1819
2003
876
2840
1723
1673
3776
2848
1592
922
Output for the Sample Input
3776
2848
2840
解法1:入力後バブルソート
入力された山の高さを配列に代入し,その配列をバブルソートで降順に整列させ,配列の先頭から3データ表示させた。
#include <iostream>
using namespace std;
int main() {
int height[10];
int tmp;
int i=0,j=0;
for (;i<10;i++)
cin>>height[i];
for (i=0;i<100;i++)
for(j=1;j<10;j++)
if (height[j-1]<height[j]) {
tmp = height[j-1];
height[j-1] = height[j];
height[j] = tmp;
}
for (i=0;i<3;i++)
cout<<height[i]<<endl;
return 0;
}
どうしてバブルソート部分の外側のループの継続条件をi<100
なんかにしたのか…。i<10
でいいだろ! (to これ書いた頃の自分)
解法2:逐次比較する
入力されるたびに,それまでの入力での山の高さの1~3位と比較していった。
#include <iostream>
using namespace std;
int main()
{
int a, res[3] = {0}, i;
for (i = 0; i < 10; i++)
{
cin >> a;
if (a > res[0])
res[2] = res[1], res[1] = res[0], res[0] = a;
else if (a > res[1])
res[2] = res[1], res[1] = a;
else if (a > res[2])
res[2] = a;
}
cout << res[0] << endl << res[1] << endl << res[2] << endl;
}