这道题是为数不多的几道pat的较难通过的题目了
自己写的,实例四 通过不了
原因:自己的时间复杂度是O(n^2),超时
解决方案: 更新ans,双层循环,加速,思想是:
在选定的ans中,关键要找出最大的ans,由前一个ans,下一个a[i],在j=I+ans时,a[j]如果满足,则前几个必然满足(因为已经按照从小到到排好序了)。
如果该a[j]不满足,则前几个满足or不满足旧没有研究的价值了。以此类推。
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
//1030 完美数列
bool cmp(int a,int b)
{
return a<b;
}
int main()
{
int N,p;
long int T;
cin>>N>>p;
int a[N];
for(int i=0;i<N;i++)
cin>>a[i];
//排序,降序排序
sort(a,a+N,cmp);
int ans=0;
for(int i=0;i<N;i++)//最大值
{
T = (long int)a[i] * p;
for(int j=i+ans;j<N;j++)//最小值
{
if(a[j]<=T)//满足完美数列
ans++;
else
break;
}
}
cout<<ans;
//所以现在你需要自己去找那个合适的最大值M和最小值m
//最多选择多少个数可以构成完美数列
return 0;
}
参考:https://bbs.csdn.net/topics/392874636
汐baby go 发布了11 篇原创文章 · 获赞 4 · 访问量 4282 私信 关注