PAT1030 完美数列 C语言

 题目难点分析

思路没啥难点,重点在于测试点4的超时解决

1.超时点1:对输入数的排序算法,我一开始用的插入算法,最后用的快排。

2.超时点2:循环的控制

 for( ; j>=0; j--)
    {
		for( i =j-max;i>=0;i--)
        {
			if(a[j] <= a[i] * p)
				dif = j - i + 1;
				if(dif > max) max = dif;
			else break;
		}
    }
    printf("%d",dif);

我是逐一比较后找出其中最大的,但并不是真的需要逐一比较。因为当你找出一个符合的数字数目后,剩下的如果差距比它小,则没必要继续比了,因此有break的条件

完整代码

#include<stdio.h>
void quicksort(int *arr,int n)
{
    if(n<2) return;
    int base=arr[0];
    int left=0;
    int right=n-1;
    int which=2;//2表示移动右下标,1表示移动左下标
    while(left<right)
    {
        if(which==2)
        {
            if(arr[right]>=base) {right--;continue;}
            else if(arr[right]<base)
            {
                arr[left]=arr[right];
                left++;
                which=1;
                continue;
            }
        }
        if(which==1)
        {
            if(arr[left]<=base) {left++;continue;}
            else if(arr[left]>base)
            {
                arr[right]=arr[left];
                right--;
                which=2;
                continue;
            }
        }
    }
    arr[left]=base;
    quicksort(arr,left);//对基准数左边的区间进行再排序递归
    quicksort(arr+left+1,n-left-1);//对基准数右边的区间进行再排序递归
}
int main()
{
    int n=0;
    long long p=0;
    scanf("%d %lld",&n,&p);
    int a[n],i=0,j=n-1,dif=1,max=0;
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    quicksort(a,n);
    
    for( ; j>=0; j--)
    {
		for( i =j-max;i>=0;i--)
        {
			if(a[j] <= a[i] * p)
				dif = j - i + 1;
				if(dif > max) max = dif;
			else break;
		}
    }
    printf("%d",dif);
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值