1030 完美数列 (25 分)

138 篇文章 1 订阅
80 篇文章 0 订阅
这篇博客探讨了一种算法问题,涉及构造完美数列。完美数列定义为数列中的最大值不超过最小值与给定参数p的乘积。作者分享了解决方案,首先对数列进行排序,然后遍历数列,计算每个元素可以构成完美数列的元素个数,并更新最大个数。关键在于动态调整最大值,而非仅依赖初始的最大值和最小值。通过这种方法,可以有效地找出能构成完美数列的最大元素数量。
摘要由CSDN通过智能技术生成

给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

8

难在测试点四和测试点五,一开始我直接遍历数组找到最大和最小,拿了20分,后来我发现,数列里的数字需要一个个挑,而不是给出的几个数最大值最小值就固定了,具体思路是这样的:
1、先将数组从小到大排序
2、遍历数组,得到m*p>=M的个数,存一下
3、如果得到的数更大,就更新,然后输出最大即可
具体思路见代码注释

#include <iostream>
#include <string>
#include<algorithm>
#include<bits/stdc++.h>
#include<stack>
#include<set>
#include <vector>
#include <map>
#include<queue>
#include<deque>
#include<cctype>
#include<unordered_set> 
#include<fstream>
using namespace std;
int main(){
	int n,p;
	cin>>n>>p;
	int a[n];
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	sort(a,a+n);
	int count=0;
	int j=0;
	for(int i=0;i<n;i++){
		int t=0;
		long temp=a[i];//这里要用long型,否则测试点5过不了,题目中包含了十的九次方
		while(temp*p>=a[j]&&j<n){//这里的j不能每次都从1开始,那样时间复杂度太高了,每次从当前找到的最大的数开始就行
			j++;
		}
		t=j-i;
		if(t>count) count=t;//如果找到更大的,直接更新即可
	}
	cout<<count;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_努力努力再努力_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值