显然,对于一个数字,他的绝对值越大,操作次数就越多,因此我们需要对数组按照绝对值从小到大排序,然后模拟整个操作过程即可。
时间复杂度
O(nlogn)
C++
#include<bits/stdc++.h>
using namespace std;
const int N=1E5+10;
typedef long long ll;
ll 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;
}
import java.util.*;
public class Main{
public static void main(String[] s){
Scanner in=new Scanner(System.in);
long n=in.nextLong(),k=in.nextLong();
Long[] arr=new Long[(int)n];
for(int i=0;i<n;i++)arr[i]=in.nextLong();
Arrays.sort(arr,(Long a, Long b)->{
return Long.compare(Math.abs(a),Math.abs(b));
});
int res=0;
for(int i=0;i<n;i++){
if(k>=Math.abs(arr[i])){
k-=Math.abs(arr[i]);
res++;
}
else break;
}
System.out.println(res);
}
}
import java.util.*;
public class Main{
public static void main(String[] s){
Scanner in=new Scanner(System.in);
long n=in.nextLong(),k=in.nextLong();
Long[] arr=new Long[(int)n];
for(int i=0;i<n;i++)arr[i]=in.nextLong();
Arrays.sort(arr,(Long a, Long b)->{
return Long.compare(Math.abs(a),Math.abs(b));
});
int res=0;
for(int i=0;i<n;i++){
if(k>=Math.abs(arr[i])){
k-=Math.abs(arr[i]);
res++;
}
else break;
}
System.out.println(res);
}
}
小美拿到了一个数组,她可以进行最多k次操作,每次操作任选一个元素加1或者减1。小美希望最终0的数量尽可能多。你能帮帮她吗?
第一行输入2个正整数n,k,代表数组大小和小美的操作次数
第二行输入n个整数ai,代表小美拿到的数组。 1≤n≤105
1≤k≤1014
−109≤ai≤109
一个整数,代表最终0的数量的最大值。
输入
4 5
-2 3 -2 9
输出
2
说明
对第二个元素操作3次减1,对第三个元素操作2次加1,这样数组变成[-2,0,0,9]。
请注意,方案并不是唯一的。但可以证明,0的数量不会超过2个。