版权声明:本文为博主原创文章,未经博主允许可以转载。(转呀转呀/笑哭),希望标注出处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;
}
};