PAT-basic-1030 完美数列 c++

发布时间 2023-04-21 00:06:00作者: 正明小佐

一、题目


给定一个正整数数列,和正整数 ,设这个数列中的最大值是 ,最小值是 ,如果 ,则称这个数列是完美数列。

现在给定参数  和一些正整数,请你从中选择尽可能多的数构成一个完美数列。

输入格式:

输入第一行给出两个正整数  和 ,其中 )是输入的正整数的个数,)是给定的参数。第二行给出  个正整数,每个数不超过 

输出格式:

在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。

输入样例:

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);
}