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 }