Untitled Web Page

とある高専生の割と誰得なウェブページです。

Problem 0001:List of Top 3 Hills

問題

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;
}