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 14:33 江苏
谢谢老哥的分享
点赞 回复 分享
发布于 2023-02-13 15:24 重庆

相关推荐

微风不断:兄弟,你把四旋翼都做出来了那个挺难的吧
点赞 评论 收藏
分享
暴走萝莉莉:这是社招场吧,作为HR说个实话:这个维护关系的意思是要有政府资源,在曾经的工作中通过人脉资源拿下过大订单的意思。这个有相关管理经验,意思也是真的要有同岗位经验。应酬什么的对于业务成交来说就算不乐意也是常态,就是要求说话好听情商高,酒量好。
点赞 评论 收藏
分享
11-26 22:34
已编辑
重庆邮电大学 Java
快手 客户端开发 (n+5)k*16 公积金12
牛客895077908号:佬 什么双非硕啊
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务