PAT1030 完美数列 (25 分)运行超时问题

现上代码,后面分析

#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)之前满足之前条件的最大长度,作为下个内循环的起点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值