Given a sequence of positive integers and another positive integer p. The sequence is said to be a perfect sequence if M≤m×p where M and m are the maximum and minimum numbers in the sequence, respectively.
Now given a sequence and a parameter p, you are supposed to find from the sequence as many numbers as possible to form a perfect subsequence.
Input Specification:
Each input file contains one test case. For each case, the first line contains two positive integers N and p, where N (≤10^5) is the number of integers in the sequence, and p (≤10^9) is the parameter. In the second line there are Npositive integers, each is no greater than 109.
Output Specification:
For each test case, print in one line the maximum number of integers that can be chosen to form a perfect subsequence.
Sample Input:
10 8
2 3 20 4 5 1 6 7 8 9
Sample Output:
8
题意:从一组序列中找出最大的满足条件的序列的长度。
分析:二分法,可以用STL例upper_bound函数。注意乘积可能超过int型表示范围
1 /**
2 * Copyright(c)
3 * All rights reserved.
4 * Author : Mered1th
5 * Date : 2019-02-26-13.58.21
6 * Description : A1085
7 */
8 #include<cstdio>
9 #include<cstring>
10 #include<iostream>
11 #include<cmath>
12 #include<algorithm>
13 #include<string>
14 #include<unordered_set>
15 #include<map>
16 #include<vector>
17 #include<set>
18 using namespace std;
19 const int maxn=100010;
20 int a[maxn];
21 int main(){
22 #ifdef ONLINE_JUDGE
23 #else
24 freopen("1.txt", "r", stdin);
25 #endif
26 int n,p;
27 scanf("%d%d",&n,&p);
28 for(int i=0;i<n;i++){
29 scanf("%d",&a[i]);
30 }
31 sort(a,a+n);
32 int num=1;
33 for(int i=0;i<n;i++){
34 int j=upper_bound(a+i+1,a+n,(long long)a[i]*p)-a;
35 num=max(num,j-i);
36 }
37 printf("%d\n",num);
38 return 0;
39 }
另一种方法是双指针,思路就是定义两个指针i,j,均从0开始遍历,j不断右移直到不满足条件,再i++。
1 /**
2 * Copyright(c)
3 * All rights reserved.
4 * Author : Mered1th
5 * Date : 2019-02-26-14.18.14
6 * Description : A1085
7 */
8 #include<cstdio>
9 #include<cstring>
10 #include<iostream>
11 #include<cmath>
12 #include<algorithm>
13 #include<string>
14 #include<unordered_set>
15 #include<map>
16 #include<vector>
17 #include<set>
18 using namespace std;
19 const int maxn=100010;
20 int a[maxn];
21 int main(){
22 #ifdef ONLINE_JUDGE
23 #else
24 freopen("1.txt", "r", stdin);
25 #endif
26 int n,p;
27 scanf("%d%d",&n,&p);
28 for(int i=0;i<n;i++){
29 scanf("%d",&a[i]);
30 }
31 sort(a,a+n);
32 int i=0,j=0,num=1;
33 while(i<n&&j<n){
34 while(j<n&&a[j]<=(long long)a[i]*p){
35 num=max(num,j-i+1);
36 j++;
37 }
38 i++;
39 }
40 cout<<num;
41 return 0;
42 }