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 }