给定一个正整数数列,和正整数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
==========================================================================================
思路:
暴力肯定是过不了的。
首先给数组排个序,然后从头开始有规则地遍历。这里定义了一个lim来做每向后推一个数的最大值上限,
随后定义了一个maxn来存储直到当前循环的最大个数。每次遍历的时候从maxn遍历即可,因为排过序,所以如果
能再多加一个数的话则前面的数没必要再进行运算;如果一个数都多加不了则肯定个数没上一次的大。
参考:http://blog.csdn.net/wanmeiwushang/article/details/51456488
#include <iostream> #include <iomanip> #include <stdio.h> #include <cmath> #include <algorithm> #include <cstring> #include <cctype> #include <sstream> #include <map> #include <set> #include <vector> #include <queue> using namespace std; long long arr[100000]; int main() { long long i,j,n,p,lim,maxn=0; scanf("%lld%lld",&n,&p); for(i=0;i<n;i++) scanf("%lld",&arr[i]); sort(arr,arr+n); for(i=0;i<n;i++) { lim = arr[i]*p; for(j=maxn+i;j<n;j++) { if(arr[j] <= lim) maxn = j-i+1; else break; } } printf("%lld\n",maxn); return 0; }