PAT乙级1030 完美数列

题目:

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

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

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

8

分析:

首先想到用数组存储,升序排列,然后从头查找每个数组元素作为完美数组首元素时所包含的数组元素个数。

这道题的坑主要有两个:

1、见代码,存储p和数组a的类型要为long或者long long,因为两者乘积会超出int范围。

2、见代码的双层循环处,如果内循环每次都从i+1开始,测试点4会超时,因此进行优化:每次都从上次查找到的不满足完美数组的数组元素位置开始继续往后查。

代码:

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
	int N;
	long p;
	cin >> N >> p;
	long a[N];
	for(int i = 0; i < N; i++)
		cin >> a[i];
	sort(a, a + N);
	int max_cnt = 0;
	for(int i = 0; i < N; i++)//外循环,每个数组元素作为完美数组首元素时
	{
        if(i + max_cnt > N - 1)//外循环跳出条件,完美数组将数组最后一个元素也包含了
            break;
		for(int j = i + max_cnt; j < N; j++)//内循环,从上次查找到不满足完美数组的位置开始继续查找
		{
			if(a[i] * p >= a[j])//内循环跳出条件,找到不满足完美数组的元素
			{
				max_cnt = j - i + 1;
			}
			else
				break;
		}
	}
	cout << max_cnt << endl;
    return 0;
}

#刷题记录#
PAT乙级 文章被收录于专栏

PAT乙级(Basic)刷题记录

全部评论
谢谢老哥的分享
点赞 回复 分享
发布于 2023-02-13 15:24 重庆
这代码写得,赞
点赞 回复 分享
发布于 2023-02-13 14:33 江苏

相关推荐

阿武同学:基本信息保留前面三行,其他的可以全部删掉,邮箱最重要的你没写,主修课程精简到8个以内,实习里面2/3/4都是水内容的,非要写的话建议两到三句话,项目经历排版优化下,自我评价缩到三行
点赞 评论 收藏
分享
10-09 17:17
已编辑
门头沟学院 Java
活泼的代码渣渣在泡池...:同学你好,我也是学院本,后天要面这个亚信科技,是实习,请问问题都啥样呀,我项目就做了网上的,这是第一次面试
投递多益网络等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务