1085 Perfect Sequence (25 分)

本文介绍了解决完美序列问题的两种方法:使用二分法结合STL的upper_bound函数,以及采用双指针策略。通过实例代码展示了如何在给定序列和参数p下,寻找最大长度的子序列,使序列中的最大数不超过最小数乘以p。
1085 Perfect Sequence (25 分)

Given a sequence of positive integers and another positive integer p. The sequence is said to be a perfect sequence if Mm×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 }

 

转载于:https://www.cnblogs.com/Mered1th/p/10437072.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值