zoukankan      html  css  js  c++  java
  • PAT (Basic Level) Practise (中文)-1030. 完美数列(25)

    PAT (Basic Level) Practise (中文)-1030. 完美数列(25)   http://www.patest.cn/contests/pat-b-practise/1030

    给定一个正整数数列,和正整数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. 一个正整数数列,最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。
    2. 给出一组正整数,但是无序。
    为了检测M <= m * p,需要得出最大值和最小值;
    为了得出最大值和最小值中间存在多少个数据,则需要知道大于等于最小值且小于等于最大值的数据有多少个。为了简化,则需要排序。
    3. 10的5次方个数据,数据量大,则必须选择高效的排序算法;数值为(0,10的九次方],最大值太高,则无法使用hash。
    4. 求最长的完美数列,而原数列已经有序。则如同两个人拉个绳子,一个站在某个数据处,另一个走向远方,直到走到不再满足完美数列时,则停止。这个绳子的长度,就是这个完美数列的长度。

    输出格式:

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



     1 #include<stdio.h>
     2 
     3 void QS(long long *num,int low,int high)
     4 {
     5      long long  temp=num[low];
     6      int l=low,h=high;
     7      while(l<h)
     8      {
     9          while(num[h]>=temp && h>l)
    10              h--;
    11          if(num[h]<temp)
    12          {
    13              num[l]=num[h];
    14              num[h]=temp;
    15              l++;
    16          } 
    17          
    18          while(num[l]<=temp && l<h)
    19              l++;
    20          if(num[l]>temp)
    21          { 
    22              num[h]=num[l];
    23              num[l]=temp;
    24              h-- ;
    25          }
    26      }
    27      if(l-1>low) QS(num,low,l-1);
    28      if(h+1<high)QS(num,h+1,high);
    29      
    30      return;
    31 }
    32 
    33 int main()
    34 {
    35     int n=0;
    36     long long  p=0;
    37     scanf("%d%lld",&n,&p);
    38     
    39     long long  num[100000]={0};
    40     for(int i=0;i<n;i++)
    41             scanf("%lld",&num[i]);
    42             
    43     if(n==1)
    44     {
    45             if(num[0]<=num[0]*p)
    46                 printf("1");
    47             else
    48                 printf("0");
    49             return 0;
    50     }
    51   
    52     QS(num,0,n-1);
    53     int diff=0,min=0,max=0;
    54     while(n-min>=diff)
    55     {
    56         while(num[max]<=num[min]*p )
    57         {
    58             max++;
    59             if(max==n) break;
    60         }   
    61         if(max-min>diff)
    62             diff=max-min; 
    63         if(max==n) break;
    64         if(min<n-1) min++;
    65     }
    66     printf("%d",diff);
    67     return 0;
    68 } 
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 黑色星期五
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    控件动态产生器(使用RegisterClasses提前进行注册)
    Delphi编写自定义控件以及接口的使用(做了一个TpgDbEdit)
    Log4delphi使用心得
  • 原文地址:https://www.cnblogs.com/asinlzm/p/4444909.html
Copyright © 2011-2022 走看看