完美数列【置顶】

链接:http://www.nowcoder.com/questionTerminal/5bed191944ce4eaa93f4bae50abc90df

题目描述

给定一个正整数数列,和正整数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

思路:题意很简单,但是真要考虑效率的话还需要好好想想办法。AC代码是看了别人的,想法很好,认真学习!
 1 AC代码:
 2 #include "iostream"
 3 #include <cstdio>
 4 #include <string.h>
 5 #include <string>
 6 #include <cmath>
 7 #include <algorithm>
 8 using namespace std;
 9  
10 const int MAXN = 100005;
11 int num[MAXN];
12  
13  
14 int main()
15 {
16     int n, p, i, j;
17     scanf("%d%d", &n, &p);
18     for(i=1; i<=n; ++i)
19     {
20         scanf("%d", &num[i]);
21     }
22     sort(num+1, num+n+1);
23     int len=0, flag=0;
24     for(int i=1; i<=n; ++i)
25     {
26         for(int j=i+len; j<=n; ++j)
27         {
28             if(num[j] > num[i]*p)
29             {
30                 break;  
31             }
32             if(j-i+1 > len)
33             {
34                 len = j-i+1;   
35             }
36         }
37     }
38     cout <<len <<endl;
39     return 0;
40 }
 1 TLE代码:
 2 #include "iostream"
 3 #include <iomanip>
 4 #include <string.h>
 5 #include <string>
 6 #include <vector>
 7 #include <cmath>
 8 #include <cctype>
 9 #include <algorithm>
10 using namespace std;
11 
12 const int MAXN = 100005;
13 int num[MAXN];
14 
15 int main()
16 {
17     int n, p, i, j;
18     //cin >>n >>p;
19         scanf("%d%d", &n, &p);
20     for(i=1; i<=n; ++i)
21     {
22         //cin >>num[i];
23         scanf("%d", &num[i]);
24     }
25     sort(num+1, num+n+1);
26     int len=0, flag=0;
27     for(int i=n; i>=1; --i)
28     {
29         for(int j=1; j<=n-i+1; ++j)
30         {
31             if(num[j+i-1] <= p*num[j])
32             {
33                 len = i;
34                 flag = 1;
35                 break;
36             }
37         }
38         if(flag == 1)
39         {
40             break;
41         }
42     }
43     cout <<len <<endl;
44     return 0;
45 }
原文地址:https://www.cnblogs.com/mtc-dyc/p/4626262.html