现上代码,后面分析
#include<stdio.h>
#include<string.h>
#include <algorithm>
using namespace std;
int main()
{
int count=1;
int N,i,m=N,j;
int number[100001];
double p;
scanf("%d %lf",&N,&p);
for(i=0;i<N;i++) scanf("%d",&number[i]);
sort(number,number+N);
for(i=0;i<N;i++)
{
for( j=i+count;j<N;j++)
{
if(number[j]>number[i]*p)
break;
else
if(j-i+1>count)
count=j-i+1;
}
}
printf("%d",count);
}
这里面运行超时的问题以我现在的水平(只学了点C来看)有两处,1.排序的算法
效率,2.在寻找最大长度时内循环的回溯点,就是从哪个点开始(直接从外循环+1回溯的话有些是无效的回溯)。给大家举个例子
现在N=5,p=2 输入1 2 2 4 6,我们可以把条件改成M/m<=p,第一回应该在内循环
遇到4的时候停下来,(M/m=4不满足了,结束内循环),按照以前的办法,此时外循环从第一个2开始,内循环从第二个2开始(j=i+1),内循环此时一定是满足条件的,(2/2=1满足,分子没有改变仍然是2,分母增大,比之前的数还小,所以一定满足)这就导致了重复判断的问题,使得效率低下
改进后的算法应该是从之前内循环不满足的点(4)开始和外循环的下一点2比较,就是找到内循环时不满足条件的点(4)之前满足之前条件的最大长度,作为下个内循环的起点