数列删减怎么做啊???TLE

代码如下:
一直TLE 0

#include<bits/stdc++.h>
using namespace std;
int minO(vector<int>& nums, int k) {
    int n = nums.size();
    int sum = 0;
    for (int i = 0; i < n; i++) {
        sum += nums[i];
    }
    if (sum <= k) {
        return 0;
    }
    
    int o = 0;
    sort(nums.begin(), nums.end());
    for (int i = n-1; i >= 0; i--) {
        if (sum <= k) {
            break;
        }
        if (i > 0 && nums[i] > nums[i-1]) {
            int diff = nums[i] - nums[i-1];
            int times = min((sum - k + diff - 1) / diff, i);
            sum -= diff * times;
            o += times;
        }
    }
    
    return o;
}

int main() {
    int T;
    cin >> T;
    
    while (T--) {
        int n, k;
        cin >> n >> k;
        
        vector<int> nums(n);
        for (int i = 0; i < n; i++) {
            cin >> nums[i];
        }
        
        cout << minO(nums, k) << endl;
    }
    
    return 0;
}

4 个赞

完整题目

3 个赞

能发一下吗

是这个吗

2 个赞

6. 数列删减

题目ID:9786必做题100分

最新提交:

Time Limit Exceeded

0 分

历史最高:

Time Limit Exceeded

0 分

时间限制: 1000ms

空间限制: 524288kB

题目描述

题目描述

给定一个长度为 n 的数列 {an},和一个整数 k。每次操作,你可以在两种操作中选一种:

  • 选择某个数 ai,将它减一。即令 ai=ai-1。
  • 选择某两个数 ai 和 aj,将一个变为另一个。即令 ai=aj。

求最少多少次操作可以让数列的和小于等于 k。

输入格式

第一行一个整数 T,表示数据组数,

每组数据第一行两个整数 n 和 k,第二行 n 个整数 a1 到 an。

输出格式

每组数据输出一行,代表答案。

一直tle,服了