• PAT乙级 1030. 完美数列(25)


    1030. 完美数列(25)

    时间限制
    300 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    CAO, Peng

    给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。

    现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。

    输入格式:

    输入第一行给出两个正整数N和p,其中N(<= 105)是输入的正整数的个数,p(<= 109)是给定的参数。第二行给出N个正整数,每个数不超过109

    输出格式:

    在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。

    输入样例:
    10 8
    2 3 20 4 5 1 6 7 8 9
    
    输出样例:
    8
    

     第一个版本

     1 #include "stdio.h"
     2 void sort(double a[],int n);
     3 void swap(double *a,double *b);
     4  int main(int argc, char const *argv[])
     5 {
     6        double a[100010],p;
     7     int i,n;
     8     scanf("%d %lf",&n,&p);
     9     getchar();
    10     for(i=0;i<n;i++)
    11     scanf("%lf",&a[i]);
    12     sort(a,n);
    13     for(i=n-1;i>0;i--)
    14     {
    15         if(a[i]<=(a[0]*p))
    16         {
    17             break;
    18         }
    19 
    20     }    
    21     printf("%d
    ",i+1 );
    22     return 0;
    23 }
    24 void sort(double a[],int n)
    25 {int i,j;
    26     for(i=0;i<n;i++)
    27         {for(j=i+1;j<n;j++)
    28             {
    29                 if(a[i]>a[j])
    30                 swap(a+i,a+j);
    31             }                
    32         }    
    33 
    34 }
    35 void swap(double *a,double *b)
    36 {
    37     double temp;
    38     temp=*a;
    39     *a=*b;
    40     *b=temp;
    41             
    42 }

    第二个版本

     1 #include "stdio.h"
     2 #include "stdlib.h"
     3 int cmp(void const *a,void const*b);
     4 int main(int argc, char const *argv[])
     5 {
     6        double *a,p;
     7     int i,j,n,count=0;
     8     while(~scanf("%d %lf",&n,&p))
     9     {
    10         a=(double*)malloc(n*sizeof(double));
    11         for(i=0;i<n;i++)
    12         scanf("%lf",&a[i]);
    13  
    14        qsort(a,n,sizeof(double),cmp);
    15        for(i=0;i<n;i++)//遍历将a[i]作为最小值
    16             for(j=i+count;j<n;j++)//
    17                 {
    18                 if(a[j]>(a[i]*p))
    19                     break;
    20                 if(j-i+1>count)
    21                     count=j-i+1;
    22                 }    
    23        printf("%d
    ",count );
    24        free(a);
    25     }
    26     return 0;
    27 }
    28 int cmp(void const *a,void const*b)
    29 {
    30     return *((double*)a)-*((double*)b);
    31 }

    思路:首先p与最小数相乘可能会超出int范围,所以这里用double,其次我们应该先将数组排序以方便计算,然后我们用双重for循环查找,查找的思路是从第一个元素作为最小数,开始往后找最大数,直到不符合条件,记录下此时的长度,然后将第二个元素作为最小数,再继续找,最后比较长度的最大值并输出,但是这样会超时,所以我们要对她进行优化,减少不必要的循环,优化的思路如下:

    首先我们同样保持第一个for循环遍历最小值,在第二个for循环中我们将j置为前一个元素作为最小数时候的长度,这样就减少了小于上一次的不必要的for循环,j依然小于 N,用一个if判断是否符合条件,用另一个if判断此次是否大于上次的长度,比如说我们把样例中的数据已经排好序:1 2 3 4 5 6 7 8 9 20 ,此时我们将array[0]作为最小数,依次向后遍历,最大数j-最小数i+1即为数列的长度,最终找到8为最大的数,此时数列长度count为8,在将a[1]作为最小数的时候,我们直接将j置为1+8为9,直接比较a[1]和a[9]作为最小最大值得时候是否满足,不满足则a[1]最为最小数的时候并不能使数列变得更长,则继续再看a[2],这样等到有大于8的时候再更新,就可以

    参考http://blog.csdn.net/wanmeiwushang/article/details/51456488

  • 相关阅读:
    C#开源资源大汇总
    GridControl 验证集合
    C#得到CPU的序列号、硬盘序列号、网卡序列号
    DeveXpress之XtraGrid一些知识
    DevExpress 经典常用功能代码收集
    XtraGrid使用方法
    一般引起Cookie丢失的原因
    婚姻軟件化、人生程序化。
    在服务器控件中需要加入单选或复选时的处理。
    访问修饰符的个人理解-private与protected
  • 原文地址:https://www.cnblogs.com/zle1992/p/5969295.html
Copyright © 2020-2023  润新知