给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。
现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数N和p,其中N(<= 10^5^)是输入的正整数的个数,p(<= 10^9^)是给定的参数。第二行给出N个正整数,每个数不超过10^9^。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
首先题意不难理解,就是先排序,再挨个筛查。但是这道题有非常多需要注意的细节
第一,计算a[j]*q的时候会爆int类型,所以需要longlong,为了方便我把所有的int 都换成了longlong
第二,double和int类型不能直接作比较,所以直接判断就行,a[i] > a[j]*q
第三,第二层for循环要加上count,因为题目给的数据很大,会超时
第四,第二层for循环int j = i+count;不能是int j = i+count+1;因为有可能就只有一个数,那么最大值最小值都是自己
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 bool cmp(int a, int b) { 5 return a>b; 6 } 7 int maxN = 0; 8 int main() 9 { 10 long long n, q; 11 cin >> n >> q; 12 if(n == 0) { 13 cout << 0; 14 return 0; 15 } 16 long long a[n]; 17 long long x; 18 long long count = 0; 19 for(long long i = 0; i < n; i++) { 20 cin >> x; 21 a[i] = x; 22 } 23 sort(a, a+n, cmp); 24 for(int i = 0; i < n; i++) { 25 //不能是i+1+count,只有一个数的话最大最小都是自己 26 for(int j = i+count; j < n; j++) { 27 if(a[i] > a[j]*q) { 28 break; 29 } 30 if(j-i+1>count) { 31 count = j-i+1; 32 } 33 } 34 } 35 cout << count; 36 return 0; 37 } 38 /* 39 10 8 40 2 3 20 4 5 1 6 7 8 9 41 */