SRM 569 DIV2 250
(問題文は省略)
students[i]、students[i+1]、students[sizeof(students)-1]の各部屋について、Yodaを割り当てた場合における、Jediの必要人数を算出し、そのうち最小のJedi数を求める…というシミュレーションを行います。
TheJediTestDiv2_countSupervisorsByYodaStudentsIndex()は、シミュレーション関数です。
1 #include <stdio.h> 2 #include <limits.h> 3 4 #define NUMOF(array) (sizeof(array)/sizeof(*array)) 5 #define MIN(x, y) (x < y ? x : y) 6 7 /* 8 * Simulate Jedis' required num by Yoda's index. 9 */ 10 int TheJediTestDiv2_countSupervisorsByYodaStudentsIndex 11 (int students[], const size_t students_numof, 12 const int Y, const int Y_students_i, const int J) 13 { 14 int i; 15 int minof_jedi = 0; 16 int Y_students_num_old; 17 18 Y_students_num_old = students[Y_students_i]; 19 20 students[Y_students_i] = 21 (students[Y_students_i] > Y ? students[Y_students_i] - Y : 0); 22 23 for(i=0; i<students_numof; i++){ 24 minof_jedi += students[i] / J; 25 if(students[i] % J > 0){ 26 minof_jedi++; 27 } 28 } 29 30 students[Y_students_i] = Y_students_num_old; 31 32 return minof_jedi; 33 } 34 35 int TheJediTestDiv2_countSupervisors 36 (int students[], const size_t students_numof, 37 const int Y, const int J) 38 { 39 int i; 40 int minof_Jedi = INT_MAX; 41 42 for(i=0; i<students_numof; i++){ 43 minof_Jedi = MIN(minof_Jedi, 44 TheJediTestDiv2_countSupervisorsByYodaStudentsIndex( 45 students, students_numof, Y, i, J)); 46 } 47 48 return minof_Jedi; 49 } 50 51 int main(void) 52 { 53 54 int students[] = {4,7,10,5,6,55,2}; 55 const int Y= 20; 56 const int J= 3; 57 58 printf("Returns: %d\n", 59 TheJediTestDiv2_countSupervisors(students, NUMOF(students), Y, J)); 60 61 return 0; 62 }