LeetCode每天刷day31:2019 力扣杯 最小化舍入误差以满足目标

版权声明:本文为博主原创文章,未经博主允许可以转载。(转呀转呀/笑哭),希望标注出处hhh https://blog.csdn.net/qq_36428171/article/details/89326530

题目:
给定一系列价格 [p1,p2…,pn] 和一个目标 target,将每个价格 pi 舍入为 Roundi(pi) 以使得舍入数组 [Round1(p1),Round2(p2)…,Roundn(pn)] 之和达到给定的目标值 target。每次舍入操作 Roundi(pi) 可以是向下舍 Floor(pi) 也可以是向上入 Ceil(pi)。

如果舍入数组之和无论如何都无法达到目标值 target,就返回 -1。否则,以保留到小数点后三位的字符串格式返回最小的舍入误差,其定义为 Σ |Roundi(pi) - (pi)|( i 从 1 到 n )。

  • 1 <= prices.length <= 500 表示价格的每个字符串
  • prices[i] 都代表一个介于 0 和 1000 之间的实数,并且正好有 3 个小数位。
  • target 介于 0 和 1000000 之间。

题目链接:最小化舍入误差以满足目标
C++:
保留小数返回double类型把我搞懵了, 题目的target没有说是什么类型小声bb

class Solution {
public:
    static bool cmp(double a, double b){
        return a > b;
    }
    string minimizeError(vector<string>& prices, int target) {
        int lens = prices.size();
        vector<double> tmp;
        int minn = 0;
        int maxn = 0;
        for(int i = 0; i < lens; i++){
            minn += floor(stod(prices[i]));
            maxn += ceil(stod(prices[i]));
            tmp.push_back((double)(stod(prices[i]) - floor(stod(prices[i]))));
        }
        sort(tmp.begin(), tmp.end(), cmp);
        if(target < minn || target > maxn)
            return "-1";
        else{
            auto itr = tmp.begin();
            while(target != minn){
                minn++;
                *itr = (1 - *itr);
                *itr++;
            }
        }
        double via = 0.0;
        for(int t = 0; t < tmp.size(); t++){
            via += tmp[t];
        }
        via = floor(via * 1000.0 + 0.5) /1000.0;
        string ret = to_string(via);
        ret = ret.substr(0,ret.size() - 3);
        return ret;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_36428171/article/details/89326530