SRM 570 DIV2 250

Cat Carolは、友人たちを自宅での食事に招待したいと考えている。
・Carolは何本かの箸を持っており、これは長さが異なるものも含みうる。
・それぞれの箸の長さを要素に含む配列(int[])が与えられる。
・招待される友人には、同じ長さをペアとする箸を使わせたい。
招待可能なCarolの友人の最大数を求めよ。

これ、「友人の最大数を求めよ」だから、Carolの使う分の箸を差し引いたうえで考えるべき?と思ったんですけど、そこは問題文に言及が無いので、考えなくていいってことか。Carolはフォークを使うから、とか、あるいは自分は食べないから、ということか。

方針としては…

・配列length[]について、ミラーループを回す。
・親と同じ値を持つ子の数を合計した結果を2で割った商を、友人数にADDする。
・同じ長さの箸は、子に0を代入し、親が0の時は、親ループをcontinueする。

ミラーループにおいては、用済みの子要素は0にするというのは、ひとつのテクニックですね。

      1 #include <stdio.h>
      2 
      3 #define NUMOF(array)    (sizeof(array)/sizeof(*array))
      4 
      5 int Chopsticks_getmax(int *length, const size_t numof_length)
      6 {
      7     int i;
      8     int j;
      9     int numof_friends = 0;
     10     int numof_same_length;
     11 
     12     for(i=0; i<numof_length-1; i++){
     13         if(length[i] == 0){
     14             continue;   
     15         }       
     16         for(j=i+1, numof_same_length=1; j<numof_length; j++){
     17             if(length[i] == length[j]){ 
     18                 numof_same_length++;
     19                 length[j] = 0;  
     20             }           
     21         }       
     22         numof_friends += (numof_same_length / 2);
     23     }   
     24 
     25     return numof_friends;
     26 }
     27 
     28 int main(void)
     29 {
     30     int length[] = \ 
     31         {35,35,35,50,16,30,10,10,35,50,16,16,16,30,50,30,16,35,50,30,10,50, \
     32          50,16,16,10,35,50,50,50,16,35,35,30,35,10,50,10,50,50,16,30,35,10, \
     33          10,30,10,10,16,35};
     34 
     35     printf("Returns: %d\n", Chopsticks_getmax(length, NUMOF(length)));
     36 
     37     return 0;
     38 }