SRM 573 DIV2 250

・FoxCielが経営するスキー場には、N個のPlaceが存在する。
・各Placeには、0〜N-1の番号が付与されている。
・各Placeの高度が、int[] altitudeで与えられる。
 その配列要素番号は、Placeの各番号に対応している。
・スキーヤーは、各Placeを、0→1→…→N-1の番号順に移動するが、
 移動先のPlaceの高度が、現在いるPlaceと同じか、より低い場合でないと移動できない。
・スキーヤーがすべてのPlaceに移動できるように、CielはいくつかのPlaceの高度を減らす必要がある。
 言い換えれば、altitude[0]>=altitude[1]>=…>=altitude[N-1]となるようにしたい。
・高度1を減らすためには、コスト1がかかる。
・以上の高度変更にかかる最小のコストを返せ。

こりゃ簡単ですね。方針としては、

配列altitude[]を総ナメして、
 1.現Placeの高度<次Placeの高度である場合、その高度差をADDする。
 2.次Placeの高度に、現Placeの高度を代入する。

で、いけそうです。

  1 #include <stdio.h>
  2 
  3 #define NUM_OF(array)   (sizeof(array)/sizeof(*array))
  4 
  5 int SkiResortsEasy_minCost(int *altitude, const size_t altitude_numof)
  6 {
  7     int cost = 0;
  8     int i;
  9 
 10     if(altitude_numof < 2){
 11         return cost;
 12     }
 13 
 14     for(i=0; i<altitude_numof-1; i++){
 15         if(altitude[i] < altitude[i+1]){
 16             cost += altitude[i+1] - altitude[i];
 17             altitude[i+1] = altitude[i];
 18         }
 19     }
 20 
 21     return cost;
 22 }
 23 
 24 int main(void)
 25 {
 26     int altitude[] = {712, 745, 230, 200, 648, 440, 115, 913, 627, 621, \
 27                       186, 222, 741, 954, 581, 193, 266, 320, 798, 745};
 28 
 29     printf("Returns: %d\n", SkiResortsEasy_minCost(altitude, NUM_OF(altitude)));
 30 
 31     return 0;
 32 }