牛客网PAT练兵场-完美数列

题目地址: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\n",MAX);
43     return 0;
44 }

 

posted @ 2019-11-19 20:05  LifeRunningError  Views(155)  Comments(0Edit  收藏  举报