PAT-B 1030 完美数列(C语言)

题目

链接:PAT (Basic Level) Practice 1030 完美数列

给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

8


思路

  1. 将数列排序;
  2. 遍历数列,两个数分别指向大数和小数,当两数商大于p时,小数往前走;当两数商小于p时,大数往前走,并保存间距最大的数。

代码

#include
#include

int comp(const void *a, const void *b){
  return *(int*)a - *(int*)b;
}

int main()
{
  int n, p, flag = 0;
  scanf("%d %d", &n, &p);
  int s[n];
  int front, rear;
  for(int i = 0; i < n; i++){
    scanf("%d", &s[i]);
  }
  int cnt;
  //排序
  qsort(s,n,sizeof(int),comp);
  
  int max = 1;
  int count;
  int m = 0;
  for(int k = 1; k < n; k++){
    front = s[k];
    rear = s[m];
    if((front / p > rear)||(front / p == rear && front % p > 0)){
      k--;
      m++;
    }
    count = k - m + 1;
    if(max < count){
      max = count;
    }
  }
  printf("%d", max);
  return 0;
}


---END---

其它相关题目

PAT-B 1026 程序运行时间(C语言)
PAT-B 1027 打印沙漏(C语言)
PAT-B 1028 人口普查(C语言)
PAT-B 1029 旧键盘(C语言)

你可能感兴趣的:(PAT-B 1030 完美数列(C语言))