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 }