SRM576 DIV2 256
[問題] (省略)
任意の水滴(intensity[intensity_i])について、スポンジαが受け止めると、αより下方にあるすべてのスポンジには到達しないので、αに使用した水滴要素の値を0にします。こうすることで、αより下方にあるスポンジのintensityの合計をとる際に、すでにαで使用された水滴は無視されます。
1.すべてのスポンジ(leftEnd[leftEnd_i])について、以下の処理を行う。 1ー1.スポンジの左位置(leftEnd[leftEnd_i])とスポンジ長(L)から、 その範囲に入る水滴要素(intensity[intensity_i])の合計をとる。 1ー2.1ー1で取得した合計を、返却用の配列(ret[leftEnd_i])に格納する。 1−3.1ー1での集計に使用した水滴要素(intensity[intensity_i])の値を0にする。
最初、C++でコーディングしていたのですが、vectorを使うとコンパイルエラーがどっさり出てきたので、見なかったことにしてCで書き直しました。TopCoder以前に、C++の文法から勉強しないとなあ…(汗)。
1 // 2 // TheExperimentDiv2.c 3 // 4 #include <stdio.h> 5 #include <string.h> 6 #include <stdlib.h> 7 8 #define NUM_OF(array) (sizeof(array) / sizeof(*array)) 9 10 void TheExperimentDiv2_determinHumidity(int *ret, const int *intensity, const size_t intensity_numof, 11 const int L, const int *leftEnd, const size_t leftEnd_numof) 12 { 13 int intensity_sum; // intensity sum per sponge 14 int *intensity_w = NULL; // local copy for intensity array 15 int leftEnd_i; // counter for sponge 16 int intensity_i; // counter for intensity 17 18 intensity_w = malloc(intensity_numof * sizeof(*intensity)); 19 memcpy(intensity_w, intensity, intensity_numof * sizeof(*intensity)); 20 21 // 22 // sum up intensity for each sponge. 23 // 24 // loop for each sponge 25 for(leftEnd_i=0; leftEnd_i<leftEnd_numof; leftEnd_i++){ 26 // loop for each intensity 27 for(intensity_i=leftEnd[leftEnd_i], intensity_sum=0; 28 intensity_i<intensity_numof && intensity_i<(leftEnd[leftEnd_i]+L); 29 intensity_i++){ 30 31 // sum up intensity for each sponge 32 intensity_sum += intensity_w[intensity_i]; 33 // intensity absorbed by avove sponge already is not to be absorbed by below one. 34 intensity_w[intensity_i] = 0; 35 } 36 ret[leftEnd_i] = intensity_sum; 37 } 38 39 free(intensity_w); 40 41 return; 42 } 43 44 int main(void) 45 { 46 // Drop num per min from each drop counters 47 const int intensity[] = {2,6,15,10,8,11,99,2,4,4,4,13}; 48 // Length of sponge 49 const int L = 4; 50 const int leftEnd[] = {1,7,4,5,8,0}; 51 int ret[NUM_OF(leftEnd)]; 52 int i; 53 54 TheExperimentDiv2_determinHumidity(ret, intensity, NUM_OF(intensity), L, leftEnd, NUM_OF(leftEnd)); 55 56 printf("Returns: {"); 57 for(i=0; i<NUM_OF(ret); i++){ 58 printf("%s", (i>0 ? ", " : "")); 59 printf("%d", ret[i]); 60 } 61 printf("}\n"); 62 63 return 0; 64 }