ACM/ICPC INC 2008 (Indonesian National Contest) - Qualification
Categories: Algoritma, Programming | June 3rd, 2008 | by Felix J | No CommentsAwal mulai login, aku menskip soal D (Maze Walker, Graph type problem), langsung menuju soal E (Lemonade One) sambil membaca soal A (Who Got The Medal?) dan soal B (Conversion Problem). Setelah membaca secara cepat, ku putuskan untuk segera meng-coding Problem A (Who Got The Medal?), walau setelah meng-coding beberapa saat sambil membaca problem B (Conversion Problem) *Ingat, I just got 1 hour to solve some problems :)* ternyata setelah mencoba mensimulasikan medal yang akan didapat, ternyata muncul ide untuk mengkonversi 0-100 kedalam 400-600… sehingga, lsg kuubah coding menjadi Problem B (waktu menunjuk pukul 3.40).
Problem ini sebenarnya tidak terlalu sulit, walau harus berhadapan dengan precission error, tapi ini dapat diselesaikan bila anda meng-assign semua nilai menjadi 0 terlebih dahulu…
kemudian bagaimana dengan cara untuk mengkonversinya? sebenarnya ini mirip sih dengan konversi suhu… caranya adalah seperti berikut. ketika sudah mendapat average dan mendapat standar deviasinya, sekarang caranya adalah untuk mengkonversi yang lainnya
caranya adalah angka yang antara 0-100 itu dikurang sama batas bawah (yang (avg - (3*sd)) itu) dibagi dengan batas atas (avg+(3*sd)) dikurang batas bawah dikali dengan 200 (200 ini adalah rentang dari 400 sampai 600 yaitu 600-400)
kemudian ditambah dengan 400 misal saja… yang dari contoh 20 30 40 itu… batas bawah adalah 0 dan batas atas adalah 60. jadi cara dapatnya adalah
((20-0) / (60-0)) * 200 dapetnya adalah 66.67 (ingat, dua angka dibelakang koma)… kemudian hasil itu ditambah dengan batas bawah dari 400-600 yaitu 400… jadi 400+66.67 = 466.67
ya… seperti itu…
tapi kita pun harus hati2 jika N adalah 1 karena rumus SD yang N-1 itu… karena N-1 adalah sebagai pembagi, maka N-1 tidak boleh 0… karena kalau sudah 0, maka lsg saja kita tulis 500.00 (nilai average)
kemudian kita pun harus hati2 jika angka yang antara 0-100 itu tuh di bawah dari batas bawah (avg-(3*sd)) dan melewati batas atas (avg+(3*sd))… maka dengan batasan2 itu, kita lsg dapat meng-coding jawabannya… *jawaban saya pun salah karena saya melupakan jika N-1 adalah 0, atau jika SD=0 (karena angkanya sama), hal ini pun mungkin juga adalah kesalahan dari beberapa tim papan atas seperti TSP (3x submission) dan beberapa tim-tim lainnya*
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include<stdio.h> #include<math.h> char name[22]; int main() { int nTC; scanf("%d", &nTC); while(nTC--) { int n; scanf("%d %[^\n]", &n, name); float point[n+2],sum=0.0,avg=0.0,sd=0.0; for(int i=0;i<n;i++) { scanf("%f", &point[i]); sum+=point[i]; } puts(name); avg=sum/n; for (int i=0;i<n;i++) sd += pow((point[i] - avg), 2); if (n>1) { sd = sqrt(sd/(n-1)); } else { puts("500.00"); continue; } float down = avg - (3*sd), upper = avg + (3*sd); for (int i=0; i<n;i++) { if (sd==0.0) { puts("500.00"); } else { float check=0.0; if (point[i] < down){ check=down; }else if (point[i] > upper){ check=upper; }else{ check=point[i]; } point[i] = 400.00 + ( ( (check-down)/ (upper-down) ) * 200.0 ); printf("%.2f\n", point[i]); } } } return 0; } |
ya… itulah hasilnya
saya berhasil menyelesaikan solusi diatas pada saat waktu menunjukkan pukul 3:59:43 (Jam 3 59 menit 43 detik). tapi karna aku melupakan beberapa point penting diatas, maka program yang kusubmit menunjukkan WA (Wrong answer).
tapi kode yang diatas, sudah ku fix dan sudah benar
Write up selengkapnya dapat dilihat pada http://competition.binus.ac.id/inc2008/Registration/
disitu ada writeup lengkap juri
Selamat untuk para tim yang telah advanced ke babak final *Wish u all the best :)*
Pages: 1 2