原文转载自:https://blog.csdn.net/coding_lin/article/details/81090434
题目链接:前m大的数
题目大意:
给定一个包含N(N<=3000)个正整数的序列,每个数不超过5000,对它们两两相加得到的N*(N-1)/2个和,求出其中前M大的数(M<=1000)并按从大到小的顺序排列。
如 4,4
1,2,3,4这个例子。
第一行两个数N和M,
第二行N个数,表示该序列。
N=4输入4个数,1,2,3,4两两相加得到的和的序列为3,4,5,5,6,7
由于M为4,所以大于前M大的4个数为7,6,5,5
由于数据量比较大,题目中说前M大的数(M<=1000)由于输出的数据量要求是1000以内,所以我们可以对存入的数据量进行剪枝。
有不对之处希望大神们能指出来。
以下是我的代码:
代码一(采用的是ArrayList的方式):
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner s =new Scanner(System.in);
while(s.hasNext()){
ArrayList<Integer> num=new ArrayList<Integer>();
int N =s.nextInt();
int M =s.nextInt();
int a[]=new int[3005]; //规定数组的范围
for(int q =0;q<N;q++){
a[q]=s.nextInt();
}
Arrays.sort(a);
int b[] =new int[a.length];
int m=0;
for(int i=a.length-1;i>=0;i--){ //把输入的数字以降序的方式排列
b[m]=a[i];
m++;
}
for(int i =0;i<70;i++){
for(int j =i+1;j<71;j++){ //规定循环次数,这里体现了剪枝的思想,其实不需要70这么大,还能开的更小
num.add(b[i]+b[j]);
}
}
Collections.sort(num, new Comparator<Integer>() { //降序排列集合中的数据
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
}
);
for(int i=0;i<M;i++) //注意格式,不然会显示输出错误
{
if(i<M-1)
System.out.print(num.get(i)+" ");
else
System.out.print(num.get(i));
}
System.out.println();
}
}
}
代码二(采用的是数据结构中的Map):
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner s =new Scanner(System.in);
while(s.hasNext()){
int a[]=new int[3005];
Map<Integer,Integer> sum=new HashMap<Integer,Integer>();
int N =s.nextInt();
int M =s.nextInt();
for(int q =0;q<N;q++){
a[q]=s.nextInt();
}
Arrays.sort(a);
int b[] =new int[a.length];
int m=0;
for(int i=a.length-1;i>=0;i--){ //把输入的数字以降序的方式排列
b[m]=a[i];
m++;
}
int key=0;
int temp=0;
for(int i =0;i<70;i++){
for(int j =i+1;j<71;j++){ //规定循环次数
key=b[i]+b[j];
if(sum.containsKey(key)){
temp=sum.get(key);
sum.put(key, temp+1);
}
else{
sum.put(key,1);
}
}
}
List<Map.Entry<Integer,Integer>> list=new ArrayList<Map.Entry<Integer,Integer>>(sum.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer,Integer>>() { //降序排列集合中的数据
public int compare(Map.Entry<Integer,Integer> o1, Map.Entry<Integer,Integer> o2) {
if(o2.getValue()!=null&&o1.getValue()!=null&&o1.getKey()>o2.getKey()){
return -1;
}
else
return 1;
}
});
boolean flag=false;
for(Map.Entry<Integer,Integer> x:list){
if(flag)break;
int num=x.getValue();
for(int i=0;i<num;i++){
if(M>1){
M--;
System.out.print(x.getKey()+" ");
}
else{
M--;
System.out.print(x.getKey());
}
if(M<=0){
flag=true;
break;
}
}
}
System.out.println();
}
}
}