题目
链接: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
思路
- 将数列排序;
- 遍历数列,两个数分别指向大数和小数,当两数商大于p时,小数往前走;当两数商小于p时,大数往前走,并保存间距最大的数。
代码
#include<stdio.h>
#include<stdlib.h>
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语言)
网友评论