在一行上输入两个整数
。
在第二行输入
个整数
。
输出一个整数,表示通过最优配对操作后小红能够获得的最大得分。
6 2 1 1 4 5 1 4
21
一种可行的最优方案如下:
选择
与
,得分
;
选择
与
,得分
;
最终总得分为
。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int k = in.nextInt();
int[] an = new int[n];
for(int i=0;i<n;i++){
an[i] = in.nextInt();
}
Arrays.sort(an); // 从小到大排序,后续从后往前取最大元素
long sum = 0; // 改为long,防止数据溢出
// 从后往前遍历,优先配对最大和次大元素
for(int i = n-1; i > 0; i--){
// 满足条件则配对,累加乘积
if(an[i] - an[i-1] <= k){
sum += (long)an[i] * an[i-1]; // 强制转型,避免int相乘溢出
i--; // 跳过已配对的次大元素
}
}
System.out.println(sum);
}
} ''' 用切片赋值的方法来更新列表,运行超时,使用pop方法在原列表上进行删除,就通过了 ''' n, k = map(int, input().split()) st = [int(x) for x in input().split()] st.sort() result = 0 i = n-1 while len(st) > 1: if st[i] - st[i-1] <= k: result += st[i] * st[i-1] st.pop() st.pop() i -= 2 else: st.pop() i -= 1 print(result)
import java.util.Arrays;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int k = in.nextInt();
int[] num = new int[n];
int count =0;
for(int i=0; i<n; i++){
num[i] = in.nextInt();
}
Arrays.sort(num);
for(int i= num.length-1; i>0; i=i-1){
if(num[i]- num[i-1] <=k){
count = count + num[i] * num[i-1];
num[i]=0;
num[i-1] =0;
// System.out.println("执行了乘法");
i = i-1;
}
}
System.out.println(count);
}
} /*
先排序,从最大的一边开始遍历
*/
package main
import (
"fmt"
"sort"
)
func main() {
var n,k, result int
fmt.Scanf("%d %d", &n, &k)
var a = make([]int, n)
for i:=0;i<n;i++{
fmt.Scanf("%d", &a[i])
}
sort.Ints(a)
for i:=len(a)-1;i>=1;{
if a[i] - a[i-1] <= k {
result+= a[i]*a[i-1]
i -=2
}else{
i--
}
}
fmt.Println(result)
}