PAT (Basic Level) Practice (中文) 1030 完美数列

 

题目链接

 

首先先对输入的数进行排序,从小到大使用快速排序。

拍完序后再去查找最长的序列。查找的过程可以在循环中加入一个当前找到的最长序列,以减小时间复杂度。

 

#include<stdio.h>
int qw(long long int z[],long long int left,long long int right){//快速排序,也可以用qsort
  long long int temp,a,i,j;
  if(left>right)
    return 0;
  temp=z[left];
  i=left;
  j=right;
  while(i!=j){
    while(i<j&&z[j]>=temp)
      j--;
    while(i<j&&z[i]<=temp)
      i++;
    if(i<j){
      a=z[i];
      z[i]=z[j];
      z[j]=a;
    }
  }
  z[left]=z[i];
  z[i]=temp;
  qw(z,left,i-1);
  qw(z,i+1,right);
  return 0;
}
int main()
{
  long long int n,p,z[100000],a,b,c,max=0;
  scanf("%lld %lld",&n,&p);
  for(a=0;a<n;a++)
    scanf("%lld",&z[a]);
  qw(z,0,n-1);
  for(a=0;a+max<=n;a++)
    for(b=a+max;b<n;b++){
      if(z[a]*p>=z[b])
          max=b-a+1;
      else
        break;
    }
  printf("%lld",max);
  return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值