排序+贪心
思路:排序 贪心
操作次数显然与数字的绝对值大小成正比,对于一个数字,最小操作次数即为
因此我们可以对原数组按照绝对值大小升序排序,然后模拟操作过程,直到
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)