• 五一训练礼包—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 的变化会导致两方价格都变化(开始我就只算了一边),公式中出现的负数情况要注意排除

  • 相关阅读:
    C语言数据结构(二)
    面向对象
    Java集合类汇总
    C语言运算符优先级和结合性
    c语言数据结构(一)
    浏览器间bug
    HTTP协议中的1xx,2xx,3xx,4xx,5xx状态码分别表示什么,列举常见错误码及含义
    SSL是啥?
    {转}大公司里怎样开发和部署前端代码?
    浏览器 HTTP 缓存原理分析
  • 原文地址:https://www.cnblogs.com/kirk-notes/p/14728180.html
Copyright © 2020-2023  润新知