完美数列
题目难度不大,但是具有警示意义。
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤m**p,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数 N 和 p,其中 N(≤105)是输入的正整数的个数,p(≤109)是给定的参数。第二行给出 N 个正整数,每个数不超过 109。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
最初的代码(测试点5有问题):
问题在于21行,ve[i]*p可能会超过整型数据的最大值,从而引起错误
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,p;
cin>>n>>p;
vector<int> ve;
while(n--)
{
int a;
cin>>a;
ve.push_back(a);
}
sort(ve.begin(),ve.end());
int rec=1;
int j=0;
for(int i=0;i<ve.size();i++)
{
while(ve[j]<=ve[i]*p&&j<ve.size())
j++;
rec=max(rec,j-i);
}
cout<<rec;
return 0;
}
修改后:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,p;
cin>>n>>p;
vector<int> ve;
while(n--)
{
int a;
cin>>a;
ve.push_back(a);
}
sort(ve.begin(),ve.end());
int rec=1;
int j=0;
for(int i=0;i<ve.size();i++)
{
long long flag=ve[i];
while(ve[j]<=flag*p&&j<ve.size())
j++;
rec=max(rec,j-i);
}
cout<<rec;
return 0;
}