1. 程式人生 > >PAT——1030. 完美數列

PAT——1030. 完美數列

for .cn 可能 i+1 array scan sta level basic

給定一個正整數數列,和正整數p,設這個數列中的最大值是M,最小值是m,如果M <= m * p,則稱這個數列是完美數列。

現在給定參數p和一些正整數,請你從中選擇盡可能多的數構成一個完美數列。

輸入格式:

輸入第一行給出兩個正整數N和p,其中N(<= 105)是輸入的正整數的個數,p(<= 109)是給定的參數。第二行給出N個正整數,每個數不超過109

輸出格式:

在一行中輸出最多可以選擇多少個數可以用它們組成一個完美數列。

輸入樣例:

10 8
2 3 20 4 5 1 6 7 8 9

輸出樣例:

8

 1 package com.hone.basical;
 2 
 3
import java.util.Arrays; 4 import java.util.Scanner; 5 6 /** 7 * 原題目:https://www.patest.cn/contests/pat-b-practise/1030 8 * @author Xia 9 * 註意點:防止p*m大於int的範圍,所有用long類型 10 */ 11 public class basicalLevel1030perfectSequence{ 12 public static void main(String[] args) { 13 Scanner s = new Scanner(System.in);
14 int n = s.nextInt(); 15 long p = s.nextInt(); 16 long a[] = new long[n]; 17 int most = 1; 18 for (int i = 0; i < n; i++) { 19 a[i] = s.nextInt(); 20 } 21 22 //先把數組按照從大到小排序 23 Arrays.sort(a); 24 /*for (int i = a.length-1; i > 0; i--) {
25 for (int j = 0; j<a.length; j++) { 26 if (a[i]<=a[j]*p) { 27 if ((i-j+1)>most){ 28 most = i-j+1; 29 } 30 } 31 } 32 } 33 */ 34 //這段代碼優於上段代碼在於,j從min開始往max遍歷,可以減少之前數值較小部分的重復 35 for (int i = 0; i < a.length; i++) { 36 for (int j = i+most; j<a.length; j++) { 37 if (a[j]<=a[i]*p) { 38 if ((j-i+1)>most){ 39 most = j-i+1; 40 } 41 }else { 42 break; //之前不小於,現在更加不可能小於(因為a[j]值是逐漸變大的)所以直接退出 43 } 44 } 45 } 46 System.out.println(most); 47 48 } 49 }

PAT——1030. 完美數列