排序+贪心

思路:排序 贪心

操作次数显然与数字的绝对值大小成正比,对于一个数字xx,最小操作次数即为x|x|

因此我们可以对原数组按照绝对值大小升序排序,然后模拟操作过程,直到k0k\le 0

C++

#include<bits/stdc++.h>
using namespace std;
const int N=1E5+10;
long long a[N],n,k;
int main(){
    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>a[i];
        a[i]=abs(a[i]);
    }
    sort(a,a+n);
    int cnt=0;
    for(int i=0;i<n;i++){
        if(k<a[i])break;
        k-=a[i];
        cnt++;
    }
    cout<<cnt<<endl;
    return 0;
}

Java

import java.util.*;

public class Main {
    static final int N = (int) 1e5 + 10;
    static long[] a = new long[N];
    static long n, k;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextLong();
        k = scanner.nextLong();
        for (int i = 0; i < n; i++) {
            a[i] = Math.abs(scanner.nextLong());  // 读取输入并取绝对值
        }
        Arrays.sort(a, 0, (int) n);  // 对数组进行排序
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            if (k < a[i]) break;  // 如果k小于当前元素,结束循环
            k -= a[i];  // 从k中减去当前元素
            cnt++;  // 计数器加1
        }
        System.out.println(cnt);  // 输出结果
    }
}

Python

n, k = map(int, input().split())
a = list(map(int, input().split()))
a = [abs(i) for i in a]
a.sort()
cnt = 0
for i in range(n):
    if k < a[i]:
        break
    k -= a[i]
    cnt += 1
print(cnt)
相关面经
全部面经
招聘动态
更多动态