【PAT乙级】1030 完美数列


一、题目

1030 完美数列 (25分)

  给定一个正整数数列,和正整数 p p p,设这个数列中的最大值是 M M M,最小值是 m m m,如果 M ≤ m p M \le mp Mmp,则称这个数列是完美数列。

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

输入格式:
输入第一行给出两个正整数 N N N p p p,其中 N N N ( ≤ 1 0 5 ) (\le10^{5}) (105)是输入的正整数的个数, p p p ( ≤ 1 0 9 ) (\le10^{9}) (109)是给定的参数。第二行给出 N N N 个正整数,每个数不超过 1 0 9 10^{9} 109

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

输入样例:

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

输出样例:

8

代码长度限制			 16 KB
时间限制				200 ms
内存限制				 64 MB


二、我的AC代码

#include <stdio.h>
#include <stdlib.h>  												//包含标准库函数qsort()。

int compare(const void *a,const void *b);  							//qsort()的自定义的比较函数。

int main(void)
{
    /* 读取输入的个数和参数 */
    int N;  														//输入的正整数的个数。
    long p;  														//给定的参数。
    scanf("%d %ld", &N, &p);
    
    /* 读取输入的N个正整数 */
    long numArray[N];  												//数组numArray用于存放输入的N个正整数。
    for(int i=0; i<N; i++){
        scanf("%ld", &numArray[i]);
    }
    
    /* 将N个正整数按升序进行排序 */
    qsort(numArray, N, sizeof(long), compare);  					//快速排序qsort()函数,在头文件stdlib.h中。
    
    /* 计算出一个完美数列中的数的最多个数 */
    int maxNum = 0;  												//表示最多可以选择多少个数来组成一个完美数列。
    for(int m=0; m<N; m++){  										//最小值从小到大,逐个计算出对应的完美数列中的数的最多个数。
        for(int M=m+maxNum; M<N; M++){  							//因为是找最多个数,所以最大值直接从第(当前最多个数)个数字开始推算。
            if(numArray[M] <= numArray[m] * p){  					//满足完美数列的条件时。
                if((M-m+1) > maxNum){  								//当前的完美数列中的数的个数比原来的完美数列最多个数要多时。
                    maxNum = M - m + 1;  							//更新完美数列中的数的最多个数。
                }
            }else{  												//不满足完美数列的条件时。
                break;  											//结束当前最小值所在完美数列的最多个数计算。
            }
        }
    }
    
    /* 输出一个完美数列中的数的最多的个数 */
    printf("%d\n", maxNum);
    
    return 0;
}

/* 自定义排序规则,用于qsort()函数 */
int compare(const void *a,const void *b)
{
    /* 初始化,将传入的两个无类型的指针,强制转换为所需要的数据类型 */
    long *la = (long *)a;
    long *lb = (long *)b;
    
    /* 比较大小的规则 */
    int result;
    result = *la - *lb;  											//a比b大,则交换两数的位置,即升序排序。
    
    return result;  												//返回正数则交换两数,返回负数则不换,返回0时也暂时不换。
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零号萌新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值