赞
踩
塔子哥拿到了一个数组,她可以进行最多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个。
OJ链接
https://codefun2000.com/p/P1820
n, k = map(int, input().split()) nums = list(map(int, input().split())) for i in range(len(nums)): if nums[i] < 0: nums[i] = -nums[i] nums.sort() ans = 0 for i in range(len(nums)): if nums[i] == 0: ans += 1 else: if k >= nums[i]: k -= nums[i] ans += 1 else: break print(ans) # 同意 n, k = map(int, input().split()) a = list(map(int, input().split())) a.sort(key = lambda x: abs(x)) ans = 0 s = 0 for x in a: s += abs(x) if s > k: break ans += 1 print(ans)
时间复杂度:O(nlogn) 排序
空间复杂度:O(1)
#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; }
时间复杂度:O(nlogn) 排序
空间复杂度:O(1)
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); int n = in.nextInt(); long k = in.nextLong(); long[] a = new long[n]; for(int i=0; i<n; i++){ a[i] = Math.abs(in.nextLong()); } Arrays.sort(a); long count = 0L; long sum = 0L; for(int i=0; i<n; i++){ sum += a[i]; if(sum<=k){ count++; }else{ break; } } System.out.println(count); } }
时间复杂度:O(nlogn) 排序
空间复杂度:O(1)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。