五一训练礼包—D

D

Content

  · 问题回溯

  · 问题分析

  · 可行代码

  · 总结

(一) 问题回溯
  
 DESCRIPTION

  INPUT

   OUTPUT

  EXAMPLE

  NOTE

(二)问题分析
   由题可知,最终价格由两部分组成 —— 交换价格(换1 + 换0)和购买价格(买0 + 买1)

  可以通过枚举的方法,枚举每种交换搭配后的价格,取其最小值。

  令 (0 -> 1) 共 i 个,(1 -> 0) 共 j 个 ,每次交换后的总价为price,最初总共有num0个 '0' 、num1个 '1' 

  总价 = 交换价格 + 购买价格 --> price = ( i + j ) * h + ( num0 + j - i ) * c0 + ( num1 + i - j ) * c1 

  整理得 price = i * ( h - c0 + c1 ) + j * ( h + c0 - c1 ) + num0 * c0 + num1 * c1

(三)可行代码

#include <iostream>
using namespace std;
int main(){
    int T;
    cin >> T;
    while (T--){
        int n, c0, c1, h;
        cin >> n >> c0 >> c1 >> h;
        int num0 = 0, num1 = 0;
        char arr[n];
        for (int i = 0; i < n; i++){
            cin >> arr[i];
            arr[i] == '1' ? num1++ : num0++;
        }
        int MinPrice = num0 * c0 + num1 * c1, MaxPrice = MinPrice;
        for (int i = 0; i <= num0; i++){
            for (int j = 0; j <= num1; j++){
                int price = MaxPrice + i * (h - c0 + c1) + j * (h + c0 - c1);
                if(price < MinPrice && price > 0) // 可能会出现负数情况
                    MinPrice = price;
                }
        }
        cout << MinPrice << endl;
    }
    return 0;
}

(四)总结
  做题前先推公式会事半功倍,题目注意要点,i 与 j 的变化会导致两方价格都变化(开始我就只算了一边),公式中出现的负数情况要注意排除

原文地址:https://www.cnblogs.com/kirk-notes/p/14728180.html