1030. 完美数列(25)
1030. 完美数列(25) 给定一个正整数数列,和正整数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
分析:用双指。i指向当前最小元素,j指向当i为最小元素是满足规则的最大元素的下一个元素。计算出当前完美数列的元素个数,并与最大的元素个数进行比较更新。
#include <iostream> #include <cstdio> #include <iostream> #include <algorithm> using namespace std; long long input[100010]; int main() { int n,p; cin>>n>>p; for(int i=0;i<n;i++) { scanf("%I64d",&input[i]); } sort(input,input+n); int max_num=0; for(int i=0,j=i+1;i<n;i++) { int now_long=0; while(j<n&&input[j]<=input[i]*p) { j++; } if(j<n) { now_long=j-i; } else if(j>=n) { if(input[j-1]<=input[i]*p) { now_long=j-i; } else { now_long=0; } } if(now_long>max_num) { max_num=now_long; } } printf("%d\n", max_num); return 0; }
——来自 熊猫 [http://www.cnblogs.com/xiongmao-cpp/]