题目地址:https://www.nowcoder.com/pat/6/problem/4056
题解:先将a数组进行排序,第一次按题意M<=n*p;n=a[0]时,M最大为J(如下图),然后n从a[0]开始,那么M是从J开始遍历,就可以算出每一次的最大长度。当J到达a数组尾部,时遍历结束。可以算出完美数列最大长度
1 /** 2 * Copyright(c) 3 * All rights reserved. 4 * Author : YCute 5 * Date : 2019-11-18-21.21.21 6 * Description : 排序后拿到最多的数 7 */ 8 #include<iostream> 9 #include<cstdio> 10 #include<cmath> 11 #include<cstring> 12 #include<algorithm> 13 using namespace std; 14 int main(){ 15 int n,p; 16 int a[100005]; 17 scanf("%d %d",&n,&p); 18 for(int i=0;i<n;i++){ 19 scanf("%d",&a[i]); 20 } 21 sort(a,a+n); 22 long long temp=a[0]*p; 23 int i; 24 for(i=0;i<n;){ 25 if(a[i]<=temp) i++; 26 else break; 27 } 28 //获取第一次的长度 29 int MAX=i; 30 int j=i; 31 //一次遍历,拿到最大的长度; 32 for(int i=1;i<n;i++){ 33 temp=a[i]*p; 34 //cout<<temp<<endl; 35 while(a[j]<=temp&&j<n){ 36 j++; 37 } 38 //cout<<j-i<<endl; 39 MAX=MAX>(j-i)?MAX:(j-i);//本次temp长度是否最大 40 if(j==n)break;//到达了数组尾部,直接结束 41 } 42 printf("%d ",MAX); 43 return 0; 44 }