分析:
- sum=0
- 取数组最大的数max
- sum+=max
- 删除数组最大元素max和值为max-1的数
- 继续步骤2,直到数组空了
直接思路:删除用标志-1来表示
import java.util.Scanner;
public class SumMax {
//查找最大元素下标
public static int selectTheMax(int[] num){
int max = -1;
int pos = -1;
for(int i=0;i<num.length;i++){
if(num[i] > max){
max = num[i];
pos = i;
}
}
return pos;
}
//将值为max-1的数变成-1,即删除它
public static void handle(int[] num,int maxpos){
int maxnum = num[maxpos];
for(int i=0;i<num.length;i ++){
if(num[i] == maxnum-1){
num[i] = -1;
break;
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
while(N-- > 0){
int count = sc.nextInt();
int num[] = new int[count];
for(int l=0;l<count;l++) {
num[l]=sc.nextInt();
}
int sum = 0;
int i = 0;
while(i < count){
int temp = selectTheMax(num);
if(temp == -1){//数组空了
break;
}
if(num[temp] != -1){
sum += num[temp];
handle(num,temp);
num[temp] = -1;//max变成-1
i++;
}else{
break;
}
}
System.out.println(sum);
}
sc.close();
}
}
更简便的思路,用优先级队列(从大到小),每次取队头元素,然后比队头元素小1的数出队列,直到队列为空。
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
public class SumMax2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
while (N-- > 0) {
int count = sc.nextInt();
int num[] = new int[count];
int max = -1;
Queue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;//从大到小
}
});
for (int l = 0; l < count; l++) {
num[l] = sc.nextInt();
queue.add(num[l]);
if (max < num[l])
max = num[l];
}
int sum = 0;
while (!queue.isEmpty()) {
int t = queue.poll();
sum += t;
while (!queue.isEmpty()&&queue.peek() == t - 1) {
queue.poll();
}
}
System.out.println(sum);
}
sc.close();
}
}