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 }