题解 | #游游的元素修改#
游游的元素修改
http://www.nowcoder.com/questionTerminal/2e3557c96138444db7eca60e8afaaac7
贪心!
由于操作时一个数+1,另一个数字-1,所以最终的数组的总和是保持不变的,因此可以知道如果数组的总和sum 在 n * l 和 n * r 之间的话,是一定有解的
然后计算变大变小各自需要的操作次数,取最大值就行(多的那几步就需要利用 [l,r]区间内的某些数进行辅助操作)
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int t = in.nextInt(); while (t-- != 0) { int n = in.nextInt(), l = in.nextInt(), r = in.nextInt(); long sum = 0; int[] nums = new int[n]; long smallCnt = 0, bigCnt = 0; for(int i = 0; i < n; i++) { nums[i] = in.nextInt(); sum += nums[i]; if(nums[i] < l) { smallCnt += l - nums[i]; } if(nums[i] > r) { bigCnt += nums[i] - r; } } if(sum > 1l * n * r || sum < 1l * n * l) { System.out.println(-1); continue; } System.out.println(Math.max(smallCnt, bigCnt)); } } }