1030 完美数列(25分)java实现
用java写算法题真是个错误的选择,试了很多次依然有个节点运行超时,先看看题目吧。
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数 N 和 p,其中 N(≤10
5
)是输入的正整数的个数,p(≤10
9
)是给定的参数。第二行给出 N 个正整数,每个数不超过 10
9
。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
这题难度不大,关键要注意p应该设置成long,用int会越界的。为了提高效率,我用的是快速排序,可还是超时了,烦哦~
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
//1030
import java.util.*;
public class Main{
public static void main(String args[]) throws IOException {
InputStreamReader ir=new InputStreamReader(System.in);
BufferedReader rd=new BufferedReader(ir);
String []s=rd.readLine().split(" ");
String []list=rd.readLine().split(" ");
long []arr=new long[Integer.parseInt(s[0])];
for(int i=0;i<list.length;i++) {
arr[i]=Long.parseLong(list[i]);
}
quickSort(arr,0,list.length-1);
int mi=0,ma=arr.length-1;
long min=arr[mi],max=arr[ma],p=Integer.parseInt(s[1]);
int num1=methd1(arr,mi,ma,p);
int num2=methd2(arr,mi,ma,p);
int num3=methd3(arr,mi,ma,p);
if(num1>=num2&&num1>=num3&&num1>0) {
System.out.println(num1);
}
else if(num2>=num1&&num2>=num3&&num2>0) {
System.out.println(num2);
}
else if(num3>=num1&&num3>=num2&&num3>0) {
System.out.println(num3);
}
else {
System.out.println(0);
}
}
public static int methd1(long arr[],int mi,int ma,long p) {
boolean judge=true;
long min=arr[mi],max=arr[ma];
while(max>min*p) {
if(judge) {
ma-=1;
max=arr[ma];
judge=false;
}
else {
mi+=1;
min=arr[mi];
judge=true;
}
}
return ma-mi+1;
}
public static int methd2(long arr[],int mi,int ma,long p) {
long min=arr[mi],max=arr[ma];
while(max>min*p) {
ma-=1;
max=arr[ma];
}
return ma-mi+1;
}
public static int methd3(long arr[],int mi,int ma,long p) {
long min=arr[mi],max=arr[ma];
while(max>min*p) {
mi+=1;
min=arr[mi];
}
return ma-mi+1;
}
public static void quickSort(long[] arr,int low,int high){
int i,j;long temp,t;
if(low>high){
return;
}
i=low;
j=high;
//temp就是基准位
temp = arr[low];
while (i<j) {
//先看右边,依次往左递减
while (temp<=arr[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (temp>=arr[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = temp;
//递归调用左半数组
quickSort(arr, low, j-1);
//递归调用右半数组
quickSort(arr, j+1, high);
}
}
希望本文能给你带来帮助!