Problem : A | B | C | D | E | F | G | H

D - Kelas Bermasalah

Soal ini bisa diselesaikan dengan dua kali perulangan (iterasi). Pertama, lakukan perulangan untung menghitung jumlah nilai seluruh siswa (agar nilai rata-rata kelas bisa diketahui), kemudian lakukan perulangan lagi untuk menghitung ada berapa banyak nilai siswa yang lebih rendah dari nilai rata-rata tersebut.

Perhatikan bahwa yang diminta adalah banyaknya nilai yang di bawah nilai rata-rata, tidak termasuk nilai yang sama dengan nilai rata-rata. Banyak peserta yang mendapatkan wrong answer karena melakukan pembulatan sederhana (truncate menjadi integer) pada nilai rata-rata yang diperoleh.
A = {4, 6, 6, 8}
jumlah    = 4 + 6 + 6 + 8 = 24
rata-rata = 24 / 4 = 6
di bawah rata-rata = 1 {4}

B = {4, 6, 6, 10}
jumlah    = 4 + 6 + 6 + 9 = 25
rata-rata = 25 / 5 = 6,25
di bawah rata-rata = 3 {4, 6, 6}
Nilai rata-rata A adalah 6 sedangkan B adalah 6,25. Jika kita membulatkan 6,25 menjadi 6 maka kita akan mendapatkan output untuk B sama seperti A, padahal seharusnya berbeda karena nilai siswa yang tepat 6 (sama dengan nilai rata-rata) tidak boleh dihitung.

Untuk mengatasi hal ini, yang harus kita lakukan adalah mengubah nilai siswa dari integer menjadi floating-point (real/float/double), bukan sebaliknya. Atau bisa juga dengan mengubah operasi pembagian menjadi perkalian seperti pada contoh program di bawah.
A_i < sum / n
adalah sama dengan...
A_i * n < sum


Statistik Problem D
YES = 23
NO - Wrong Answer = 70
NO - Time Limit Exceeded = 8
NO - Run-time Error = 3
NO - Compile Error = 6


Solusi C/C++   (oleh Suhendry Effendy)
#include <cstdio>
using namespace std;

int main()
{
  int T;
  scanf( "%d", &T );

  while ( T-- ) {
    int n, arr[10005];
    int ans = 0, sum = 0;

    scanf( "%d", &n );
    
    for ( int i = 0; i < n; i++ ) scanf( "%d", &arr[i] );
    for ( int i = 0; i < n; i++ ) sum += arr[i];
    for ( int i = 0; i < n; i++ ) if ( arr[i] * n < sum ) ans++;
    
    printf( "%d\n", ans );
  }
  
  return 0;
}
Solusi Pascal   (oleh Eko Wibowo)
var
  arr : array[1..10000] of longint;
  T, n, i, ans, sum : longint;
begin
  read(T);
  while (T > 0) do
  begin
    T   := T - 1;
    ans := 0;
    sum := 0;
    read(n);
    for i := 1 to n do read(arr[i]);
    for i := 1 to n do sum := sum + arr[i];
    for i := 1 to n do
      if arr[i] * n < sum then ans := ans + 1;
    writeln(ans);
  end;
end.