携程9/28笔试第三题讨论

当时做有bug,结果交了卷改了3分钟貌似对了,求dalao们看看对不对

dp遍历数组,每个元素分为取或不取,维护index保存取的元素索引

#include <algorithm>
#include <iostream>
#include <string>
#include <unordered_set>
#include <vector>
using namespace std;

unordered_set<int> index;
double dp(vector<double> nums, int cur, int k) {
    //剩余次数为0
    if (k == 0) {
        double min_i = *min_element(nums.begin(), nums.end());
        double max_i = *max_element(nums.begin(), nums.end());
        return max_i - min_i;
    }
    //从后往前遍历到第一个元素时
    if (cur == 0) {
        double sum = 0;
        index.insert(cur);
        for (auto i : index) sum += nums[i];
        double avl = sum / index.size();
        for (auto i : index) nums[i] = avl;
        double min_i = *min_element(nums.begin(), nums.end());
        double max_i = *max_element(nums.begin(), nums.end());
        index.erase(cur);
        return max_i - min_i;
    }

    double a = dp(nums, cur - 1, k);
    index.insert(cur);
    double b = dp(nums, cur - 1, k - 1);
    index.erase(cur);
    return min(a, b);
}

int main() {
    int n, k, tmp;
    cin >> n >> k;
    vector<double> nums;
    for (int i = 0; i < n; ++i) {
        cin >> tmp;
        nums.push_back(tmp);
    }
    cout << dp(nums, n - 1, k) << endl;

    system("pause");
    return 0;
}

#携程笔试#
全部评论
行行出大神
点赞 回复 分享
发布于 2022-09-29 16:52 河南

相关推荐

爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
点赞 2 评论
分享
牛客网
牛客企业服务