PAT算法笔记(七)————完美数列(快速排序)

来源:互联网 发布:首页源码 编辑:程序博客网 时间:2024/05/01 10:21

题目描述

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

输入描述:

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


输出描述:

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

输入例子:

10 82 3 20 4 5 1 6 7 8 9

输出例子:

8
代码:
#include<iostream>using namespace std;void Qsort(double *Array, int left, int right){if (left >= right)return;int first = left;int last = right;int key = Array[first];while (first < last){while (first < last && Array[last] >= key)last--;Array[first] = Array[last];while (first < last && Array[first] <= key){++first;}Array[last] = Array[first];}Array[first] = key;Qsort(Array, left, first - 1);Qsort(Array, first + 1, right);}int main(){int N, p;double Array[100000];cin >> N >> p;for (int i = 0; i < N; i++)cin >> Array[i];Qsort(Array, 0, N - 1);int maxNum=0;for (int i = 0; i < N; i++){for (int j = i+maxNum; j < N; j++){if (Array[j] > Array[i] * p)break;if (j - i + 1 > maxNum)maxNum = j - i + 1;}}cout << maxNum;}核心思路和陷阱:
首先需要排序,原因:由于m*p限制了M的范围,所以尽可能选取大的最小值m,所以需要排序后进行两次循环判断。
涉及到快速排序算法。
0 0