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 (<= 105) is the number of integers in the sequence, and p (<= 109) is the parameter. In the second line there are N positive 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
 #include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
long long num[];
bool cmp(long long a, long long b){
return a < b;
}
int binSearch(long long num[], int low, int high, long long m, long long p){
long long ans = p * m;
int mid = high;
while(low < high){
mid = (low + high) / ;
if(num[mid] > ans){
high = mid;
}else low = mid + ;
}
return low;
}
int main(){
int N, p, index, ans = -;
scanf("%d%d", &N, &p);
for(int i = ; i < N; i++)
scanf("%lld", &num[i]);
sort(num, num + N, cmp);
for(int i = ; i < N; i++){
index = binSearch(num, i + , N, num[i], p);
index--;
if(index - i + > ans){
ans = index - i + ;
}
}
printf("%d", ans);
cin >> N;
return ;
}

总结:

1、题意:给出一个数列和一个数字p,求满足M <= mp 的最长子数列, M与m分别为最大最小值。先对原数列排序一下,对比条件,显然M越大、m越小可以得到的子数列长度越长。因此可以从排好序的数列的两端往中间搜索答案,但是如果暴力二重循环会出现超时。因此,只能从左端递增遍历m, 而右端的M改用二分搜索,将复杂度变为 n*logn。

2、二分搜索M,目标是找到序列中尽可能靠右的且满足 M <= mp 的M, 即最后一个满足所给条件的M。这个可以转化为搜索第一个满足 M > mp 的num[i]。 则num[i - 1]即为最后一个满足M <= mp的M。

3、本题还可以使用两点法做,即使用两个指针,一遍扫描。如果a[j] <= a[i]* p成立,那么在[i, j]之内的任意k,都有a[k] <= a[i] *p成立,基于这一点设置i、j两个指针,j先递增,发现不等式不成立之后,i再向前走一步,如此反复。双指针法不仅可以一头一尾,也可以在同方向使用。代码如下:

 #include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
long long num[];
bool cmp(long long a, long long b){
return a < b;
} int main(){
int N, p, index, ans = -;
scanf("%d%d", &N, &p);
for(int i = ; i < N; i++)
scanf("%lld", &num[i]);
sort(num, num + N, cmp);
int i = , j = ;
while(i < N && j < N){
long long temp = num[j] - num[i] * p;
if(temp <= ){
ans = max(ans, j - i);
j++;
}else{
i++;
}
}
printf("%d", ans + );
cin >> N;
return ;
}

4、二分搜索:

1)搜索满足某条件的元素。  

int binSearch(int num[], int low, int high, int x){
int mid;
while(low <= high){ //当搜索区间为空时结束
mid = low + (high - low) / ;
if(num[mid] == x)
return mid;
else if(num[mid] > x)
high = mid - ;
else low = mid + ;
}
return -;
}

2)搜索第一个满足某条件的元素,在这个情况下要注意,被排好序的序列一定是从左到右先不满足条件,然后满足;另外,传入的high = N时,在搜索不到满足条件的数时,会返回N(假想N位置有数字); 返回的是low而不是mid。

/*返回第一个大于等于x的元素。num[N]数组应从小到大排序。
如果传入的high = N,则当序列中所有元素都小于x时,会返回N */
int binSearch(int num[], int low, int high, int x){
int mid;
while(low < high){ //当low == high时结束搜索
mid = low + (high - low) / ;
if(num[mid] >= x)
high = mid; //mid有可能就是结果,所以区间上限不能漏掉mid
else low = mid + ;
}
return low; //返回low而不是mid
}

A1085. Perfect Sequence的更多相关文章

  1. PAT甲级——A1085 Perfect Sequence

    Given a sequence of positive integers and another positive integer p. The sequence is said to be a p ...

  2. PAT_A1085#Perfect Sequence

    Source: PAT A1085 Perfect Sequence (25 分) Description: Given a sequence of positive integers and ano ...

  3. 1085 Perfect Sequence (25 分)

    1085 Perfect Sequence (25 分) Given a sequence of positive integers and another positive integer p. T ...

  4. 1085. Perfect Sequence (25) -二分查找

    题目如下: Given a sequence of positive integers and another positive integer p. The sequence is said to ...

  5. 1085. Perfect Sequence

    Given a sequence of positive integers and another positive integer p. The sequence is said to be a “ ...

  6. PAT 甲级 1085 Perfect Sequence

    https://pintia.cn/problem-sets/994805342720868352/problems/994805381845336064 Given a sequence of po ...

  7. PAT 1085 Perfect Sequence

    PAT 1085 Perfect Sequence 题目: Given a sequence of positive integers and another positive integer p. ...

  8. PAT 1085 Perfect Sequence[难]

    1085 Perfect Sequence (25 分) Given a sequence of positive integers and another positive integer p. T ...

  9. pat1085. Perfect Sequence (25)

    1085. Perfect Sequence (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CAO, Peng Give ...

随机推荐

  1. maven 第一个Web项目——HelloWorld

    1.安装Maven,具体步骤,参照博客[maven的安装与配置]http://www.cnblogs.com/dyh004/p/8523260.html 2.配置阿里云为Maven中央仓库,具体步骤, ...

  2. 【个人阅读作业】软件工程M1/M2总结

    链接:”看<快速软件开发>的五个问题“ http://www.cnblogs.com/leiyy/p/4027759.html 一.较为明白的问题 1. 在文章的第一个关于Square_T ...

  3. M2postmortem

    设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 答:我们的软件主要解决信息提取的问题.定义清晰:要提取的内容包括于计算机科学相关内容的标题.作者. ...

  4. Can't find model 'en'

    在使用 nlp = spacy.load("en") 报错OSError: Can't find model 'en' 应该用 python -m spacy download e ...

  5. sho

    手工编程:hello world 全部用命令行工具和Notepad编辑器,用手工创建并编译一个C的命令行程序:hello world. public class Hello{         publ ...

  6. FZU软工第五次作业-词组频率分析

    目录 00.前言: 01.分工: 02.PSP表格: 03.解题思路描述与设计实现说明: 解题思路简述: 关键代码 04.附加题设计与展示: 设计的创意独到之处 实现思路 实现成果展示 05.关键代码 ...

  7. shell脚本--逻辑判断与字符串比较

    涉及到比较和判断的时候,要注意 整数比较使用-lt,-gt,ge等比较运算符,详情参考:整数比较 文件测试使用 -d, -f, -x等运算发,详情参考:文件测试 逻辑判断使用    && ...

  8. HTTP Client使用总结

    1.如果服务器使用HTTPS协议,使用HTTPClient的话,需要配以EasySSLProtocolSocketFactory 2.Tomcat对HTTP的Post和Get请求处理是不一样的.Spr ...

  9. MSTSC 3389 端口修改

    1. 启动注册表编辑器. 2. 找到并单击以下注册表子项: 3. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server ...

  10. RAID 磁盘阵列说明

    Copy From wiki RAID档次 最少硬盘 最大容错 可用容量 读取性能 写入性能 安全性 目的 应用产业 单一硬盘 (引用) 0 1 1 1 无     JBOD 1 0 n 1 1 无( ...