A1085. Perfect Sequence
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的更多相关文章
- PAT甲级——A1085 Perfect Sequence
Given a sequence of positive integers and another positive integer p. The sequence is said to be a p ...
- PAT_A1085#Perfect Sequence
Source: PAT A1085 Perfect Sequence (25 分) Description: Given a sequence of positive integers and ano ...
- 1085 Perfect Sequence (25 分)
1085 Perfect Sequence (25 分) Given a sequence of positive integers and another positive integer p. T ...
- 1085. Perfect Sequence (25) -二分查找
题目如下: Given a sequence of positive integers and another positive integer p. The sequence is said to ...
- 1085. Perfect Sequence
Given a sequence of positive integers and another positive integer p. The sequence is said to be a “ ...
- PAT 甲级 1085 Perfect Sequence
https://pintia.cn/problem-sets/994805342720868352/problems/994805381845336064 Given a sequence of po ...
- PAT 1085 Perfect Sequence
PAT 1085 Perfect Sequence 题目: Given a sequence of positive integers and another positive integer p. ...
- PAT 1085 Perfect Sequence[难]
1085 Perfect Sequence (25 分) Given a sequence of positive integers and another positive integer p. T ...
- pat1085. Perfect Sequence (25)
1085. Perfect Sequence (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CAO, Peng Give ...
随机推荐
- MySQL主主同步配置
1. MySQL主主配置过程 在上一篇实现了主从同步的基础上,进行主主同步的配置. 这里用node19(主),node20(从)做修改,使得node19和node20变为主主同步配置模式 修改配置文件 ...
- Ionic 2 官方示例程序 Super Starter
原文发表于我的技术博客 本文分享了 Ionic 2 官方示例程序 Super Starter 的简要介绍与安装运行的方法,最好的学习示例代码,项目共包含了 14 个通用的页面设计,如:引导页.主页面详 ...
- 个人博客作业_week7
心得 在为期将近一个月的团队编程中,给我感受最深的是敏捷开发和团队中队员之间的互补. 在最初的软件开发中,由于以前没有这方面的经验,所以并没有很大的进展.在慢慢过度中,我们找到了自己的节奏感,大家各自 ...
- 20135327郭皓--Linux内核分析第七周 可执行程序的装载
第七周 可执行程序的装载 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 ...
- Java 类的加载
package com.cwcec.p2; class C { public static final int SIZE; static { SIZE = 100; System.out.printl ...
- Mind Manager X 10 registry backup key under windows XP
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Mindjet\MindManager\10] [HKEY_CURRE ...
- [cnblog新闻]历史性时刻:云硬件支出首次高于传统硬件
https://news.cnblogs.com/n/617487/ 据调研公司 IDC 声称,2018 年第三季度云硬件支出占 IT 总收入的 50.9%. 知名调研公司 IDC 声称,面向云的 I ...
- [转帖]GitHub上整理的一些工具
GitHub上整理的一些工具 技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 inf ...
- 软件工程_7th weeks
内聚和耦合(学习笔记) 一.内聚 内聚是一个模块内部各成分之间相关联程度的度量.把内聚按紧密程度从低到高排列次序为: 1.偶然内聚:指一个模块内各成分为完成一组功能而组合在一起,它们相互之间即使有关系 ...
- Delphi之Exception获得错误信息(简单好理解)
Delphi之Exception获得错误信息 相关资料: http://www.cnblogs.com/hackpig/archive/2010/02/15/1668547.html 实例代码: 1 ...