NC501 牛牛的消消乐(牛客网)

本文介绍如何通过两次操作,选择合适的整数x,将数组中大于等于x的数减去x,以实现数组元素之和的最小化。讲解了问题背景、暴力遍历的解题思路,并提供了一个Solution类的实例代码。适合理解数组操作优化问题的读者。
摘要由CSDN通过智能技术生成

描述

给定一个数组 nums,其中有 n 个非负整数。你的目的是进行两次操作,使得数组的元素之和最小。
每次操作形如:任选一个整数 x ,将数组中所有大于等于 x 的数减去 x 。

示例1

输入:

[2,1,3]

复制返回值:

0

复制说明:

初始数组为 [2, 1, 3]。

先选择 x = 2,则所有大于等于 2 的元素减去 2 ,变成 [0, 1, 1]。

再选择 x = 1,则所有大于等于 1 的元素减去 1 ,变成 [0, 0, 0]。

所以数组元素之和的最小值为 0。

备注:

对于所有的测试数据,保证有1≤n≤30001≤n≤3000 且 0≤numi≤231−10≤numi​≤231−1 。

解题思路:

就直接暴力的遍历两次求解就行了,n才3000,应该不会超时的。注意的是中间的tenp和nums的使用,因为循环里的-=内操作会把temp的值覆盖掉,所以一定要减nums噢~

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回两次操作后,数组元素之和的最小值
     * @param nums int整型vector 这你你需要操作的数组
     * @return long长整型
     */
    long long minimumValueAfterDispel(vector<int>& nums) {
        // write code here
        long long len = nums.size();
        sort(nums.begin(),nums.end());
        long long sum=0;
        for(int i=0;i<len;i++){
            sum+=nums[i];
        }
        vector<int> temp = nums;
        long long minn = sum;
        for(int i=0;i<len;i++){
            for(int j=i;j<len;j++){
                temp[j]-=nums[i]; //这个nums不能用temp,因为会覆盖
            }
            long long res = sum-nums[i]*(len-i); //这个nums不能用temp,因为会覆盖
            sort(temp.begin(),temp.end());
            for(int j=0;j<len;j++){
                if((res-temp[j]*(len-j))<minn){
                    minn=(res-temp[j]*(len-j));
                }
            }
            temp=nums;
        }
        return minn;
    }
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值