PAT 1030 完美数列

1030 完美数列(25)(25 分)

给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果 M <= m p ,则称这个数列是完美数列。
现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数N和p,其中N(<= 10 5 )是输入的正整数的个数,p(<= 10 9 )是给定的参数。第二行给出N个正整数,每个数不超过 10 9
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:

10 8
2 3 20 4 5 1 6 7 8 9

输出样例:

8




解析

这题首先把输入的数列排序。再嵌套for循环即可。用c语言就要自己写排序代码,写冒泡等O( N 2 )算法会运行超时。如果你能写快派自然是最好(随便练习快派d=====( ̄▽ ̄*)b)。我用了STL里的sort.
为什么我贴了两个代码呢?看注释。


完整代码:
AC:

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
int main()
{
  int num,p;
  scanf("%d %d",&num,&p);
  double *array=(double *)malloc(sizeof(double)*num);
    for(int i=0;i<num;i++)
        scanf("%lf",array+i);
  std::sort(array,array+num);
  int max=0;
  for(int i=0;i<num;i++){
    for(int j=i+max;j<num;j++){
       if(array[j]>array[i]*p) 
          break;
       if(j-i+1>max)        
          max=j-i+1;

    }
  }
    printf("%d",max);
}

超时:

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
int main()
{
  int num,p;
  scanf("%d %d",&num,&p);
  double *array=(double *)malloc(sizeof(double)*num);
    for(int i=0;i<num;i++)
        scanf("%lf",array+i);
  double *amplify=(double *)malloc(sizeof(double)*num);
  std::sort(array,array+num);
  for(int i=0;i<num;i++)
    *(amplify+i)=*(array+i)*p;
  int max=0;
  for(int i=0;i<num-1;i++){
    for(int j=num-1;j>=(max+i);j--){     //不能从数组末->数组头。
            if((j-i+1) < max)           // 因为题目输入的p很小,所以导致完美数列长度很小。  
                break;                  // 所以就说,题目输入的一行数字,只有前面几个数能组成
      if(*(amplify+i)>=*(array+j)){     //完美数列,或后面几个数能组成完美数列。
                    max = (j-i)+1;      //所以从数组头->数组末 才行。
            break;
        }
    }
  }
    printf("%d",max);
}

猜你喜欢

转载自blog.csdn.net/weixin_41256413/article/details/81103721