B1030 完美数列 (25分)

数学题

1. 原文

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

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

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

1
8

2. 解析思路

两个int相乘可能超过范围,用long long表示,范围扩大为1018

3. AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<cstdio>
#include<algorithm>
using namespace std;
long long num[100010]={};
int main(){
int n,p;
scanf("%d%d",&n,&p);
for (int i = 0; i < n; ++i)
{
scanf("%lld",&num[i]);
}
sort(num,num+n);
int i=0;
int j=0;
int ans=-1;
while(i<n&&j<n)
{
while(j<n&&num[j]<=num[i]*p){
j++;
}
ans=max(ans,j-i);
i++;
}
printf("%d\n",ans);
return 0;
}
本文结束  感谢您的阅读
  • 本文作者: Wang Ting
  • 本文链接: /zh-CN/2019/09/07/B1030/
  • 发布时间: 2019-09-07 10:48
  • 更新时间: 2021-10-29 14:16
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

Gitalking ...