PAT-basic-1030 完美数列 c++
一、题目
给定一个正整数数列,和正整数 ,设这个数列中的最大值是 ,最小值是 ,如果 ,则称这个数列是完美数列。
现在给定参数 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数 和 ,其中 ()是输入的正整数的个数,()是给定的参数。第二行给出 个正整数,每个数不超过 。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
二、解析
一种比较笨的暴力方法,将原数组排序后,逐个遍历。思路比较简单。
三、代码
java超时版:
查看代码
package shuati;
import java.util.Arrays;
import java.util.Scanner;
public class PAT_BASIC_1030 {
private static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
int n = input.nextInt();
long p = input.nextLong();
int num[] = new int[n];
for(int i=0; i<n; i++){
int temp = input.nextInt();
num[i] = temp;
}
Arrays.sort(num);
int maxCount = 0;
int tempCount = 0;
for(int i=0; i<n; i++){
int j;
tempCount = n-i;
for(j=n-1; j>=0; j--){
if(num[j] <= num[i]*p)
break;
tempCount--;
}
if(tempCount > maxCount)
maxCount = tempCount;
if(maxCount > n-i)
break;
}
System.out.println(maxCount);
}
}
c++ AC版,java很容易超时,这题还是用的暴力遍历。从后往前遍历有逻辑上的错误,但是加上maxCount,从前往后遍历就没问题,挺迷的。
#include <algorithm>
#include "iostream"
int main(){
int n;
long long p;
std::cin>>n>>p;
int num[n];
for(int i=0; i<n; i++){
std::cin>>num[i];
}
std::sort(num, num+n);
int maxCount = 0;
for(int i=0; i<n; i++){
for(int j=i+maxCount; j<n; j++){
if(num[j] <= num[i]*p){
maxCount = j-i+1;
}else
break;
}
}
printf("%d", maxCount);
}