题目链接: https://www.dotcpp.com/oj/problem2689.html
一开始没仔细看题目,以为是自然连续数= =~搞得我还发了篇提问,怪尴尬的= = =
https://ask.csdn.net/questions/7913935?spm=1001.2014.3001.5505
解题思路
第一次尝试:
一开始我以为可以用Arrays.sort(arr);对元素进行调整,然后怎么也AC不了
package ___2022年省赛Java大学A组;
import java.util.Arrays;
import java.util.Scanner;
public class 最优清零方案_AC {
private static int n,k ;
private static long arr[];
private static long ans;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
k = sc.nextInt();
arr = new long[(int) n];
for(int i=0;i<arr.length;i++) {
arr[i] = sc.nextLong();
}
Arrays.sort(arr);
//System.out.println("排序后的元素:"+Arrays.toString(arr));
System.out.println(process(arr,k));
}
private static long process(long[] arr, int k) {
long count = 0;
int m = 0;
while(m<=arr.length -k) {
long min = Integer.MAX_VALUE;
int index = -1;
for(int i=m;i<m+k;i++) {
if(arr[i]<=min) {
min = arr[i];
index = i;
}
}
for(int i=m;i<m+k;i++) {
arr[i]-=min;
}
count+=min;
m = index+1;
}
long sum = Arrays.stream(arr).sum();
count+=sum;
return count;
// TODO Auto-generated method stub
}
}
#如图所示,因为没有充会员,看不了测试样例,所以一开始不知道什么原因,(当然了,实际比赛的时候肯定也没有过多的测试样例给你,所以大家千万要细心)
暴露出以下问题:
(1) 答案错误,上述已经提到原因
(2)时间超时 ,,因此我们需要想办法去优化计算复杂度,最好的解决办法就是每次以当前的min值去减少,去求和
AC代码
package ___2022年省赛Java大学A组;
import java.util.Arrays;
import java.util.Scanner;
/**
*
* @author Wzi
* 给定一个长度为 N 的数列 A1, A2, · · · , AN。
* 现在小蓝想通过若干次操作将这个数列中每个数字清零。
*
*每次操作小蓝可以选择以下两种之一:
1. 选择一个大于 0 的整数,将它减去 1;
2. 选择连续 K 个大于 0 的整数,将它们各减去 1。
*
*/
public class 最优清零方案_编码计算 {
private static int n,k ;
private static int arr[];
//private static long ans;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
k = sc.nextInt();
arr = new int[n];
for(int i=0;i<arr.length;i++) {
arr[i] = sc.nextInt();
}
System.out.println(process(arr,k));
}
private static long process(int[] arr, int k) {
// TODO Auto-generated method stub
long count = 0; //通计算了多少次
int index = 0; //最初处理位置
//long ans = 0; //最后用于输出的答案
long remind = arr.length;
while(index <= arr.length -k) { //小于k则不进行操作了
long min = Integer.MAX_VALUE;
int index_way = -1;
for(int i=index ;i<index+k;i++){ //找出最小值
if(arr[i] <= min) {
min = arr[i];
index_way = i;
}
}//for(int i=index ;i<index+k;i++)
//加速减
for(int i=index;i<index+k;i++) {
arr[i]-=min;
}
count+=min;
index=index_way+1;
}
for(int k1=index;k1<arr.length;k1++) {
count+=arr[k1];
}
return count;
}//end -private static long process(int[] arr, int k)
}
参考来源: https://cloud.tencent.com/developer/article/2236442