由于数值比较大,选用long型的

  先用快速排序方法对数组进行排序,然后进行查找。

  用一个问题是所要查找的数可能不在数组中,因此不能用现成的二叉查找法。试着对二叉查找法进行改进,单没调通。

  在查找过程中,由于是查找最大值,而且数据是经过升序排序后的。所以最大值应该离数组末端近一些,故最开始的想法是从后往前顺序查找。

  但这样有一组测试始终超时。

  后来想了一个缩短查找时间的发放。就是从前往后查找。,但每次查找的起点是前一个数据的最大值的位置。至于前一个最大值的位置,是在每次查找到最大值后,记录了其位置。

  网上有一种方法是用最小值的位置加上已找到的最大队列个数的值作为本轮查找的起始位置。

  相比而言,该方法与我的方法思想都一样,但是其效率应该更高。  

  因为其是在已找到的最大个数的基础上先判断本数列的个数会不会大于前面的最大个数,如果会,则继续查找,找到最大个数。如果不会,直接进行下一个最小数的查找,其避免了不必要的查找。

  而我的方法是先找出当前数能得到的最大数列的个数,在比较该个数是否大于前面的个数。这样可以求出每个数对应的最大数列。  

  我的方法主要在于进行了不必要的查找。

我的方法的code:

#include<iostream>
#include<vector>
#include<algorithm> using namespace std; void quicksort(vector<long>& num,long left,long right)
{
if(left>=right)
return;
long low=left;
long high=right;
long key=num[left];
long tmp; while(low<high)
{
while(high>low && num[high]>=key)
high--;
while(high>low && num[low]<=key)
low++;
if(low<high)
{
tmp=num[low];
num[low]=num[high];
num[high]=tmp;
}
} num[left]=num[low];
num[low]=key; quicksort(num,left,low-);
quicksort(num,low+,right);
} /*
long binaryserach(vector<long> & a,long value,long low,long high)
{
long mid=(low+high)/2;
if(a[mid]==value)
return mid;
if(a[mid]>value)
{
if(a[mid-1]>value)
return binaryserach(a,value,low,mid-1);
else
return mid-1;
}
if(a[mid]<value)
{
if(a[mid+1]>value)
return mid;
if(a[mid+1]==value)
return mid+1;
if(a[mid+1]<value)
return binaryserach(a,value,mid+1,high);
} }*/ int main()
{
long p,tmp,max;
long N,count=; cin >>N>>p; vector<long> number; for(long i=;i<N;i++)
{
cin>>tmp;
number.push_back(tmp);
} quicksort(number,,number.size()-); long right=;
/* long left,right; for(long i=0;i<number.size();i++)
if(number[i]*p>=number[number.size()-1])
{
left=i;
break;
}*/ for(long i=;i<number.size();i++)
{
//max=number[i]*p;
for(long j=right;j<number.size();j++)
if(number[j]<=number[i]*p)
{
right=j;
if(count<j-i+)
count=j-i+;
}
else
break;
}
cout<<count<<endl; return ;
}

网上的方法:

#include<iostream>
#include<vector>
#include<algorithm> using namespace std; void quicksort(vector<long>& num,long left,long right)
{
if(left>=right)
return;
long low=left;
long high=right;
long key=num[left];
long tmp; while(low<high)
{
while(high>low && num[high]>=key)
high--;
while(high>low && num[low]<=key)
low++;
if(low<high)
{
tmp=num[low];
num[low]=num[high];
num[high]=tmp;
}
} num[left]=num[low];
num[low]=key; quicksort(num,left,low-);
quicksort(num,low+,right);
} int main()
{
long p,tmp,max;
long N,count=; cin >>N>>p; vector<long> number; for(long i=;i<N;i++)
{
cin>>tmp;
number.push_back(tmp);
} quicksort(number,,number.size()-); for(long i=;i<number.size();i++)
{
for(long j=i+count-;j<number.size();j++)
if(number[j]<=number[i]*p)
{
if(count<j-i+)
count=j-i+;
}
else
break;
}
cout<<count<<endl; return ;
}

PAT---完美数列的更多相关文章

  1. PAT (Basic Level) Practise (中文)-1030. 完美数列(25)

    PAT (Basic Level) Practise (中文)-1030. 完美数列(25)   http://www.patest.cn/contests/pat-b-practise/1030 给 ...

  2. 牛客网PAT练兵场-完美数列

    题目地址:https://www.nowcoder.com/pat/6/problem/4056 题解:先将a数组进行排序,第一次按题意M<=n*p;n=a[0]时,M最大为J(如下图),然后n ...

  3. PAT 1030. 完美数列(25)

    给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列. ...

  4. PAT (Basic Level) Practise:1030. 完美数列

    [题目链接] 给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一 ...

  5. PAT乙级 1030. 完美数列(25)

    1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...

  6. PAT 乙级1030 完美数列(25) C++版

    1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...

  7. PAT B1030 完美数列 (25 分)

    给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...

  8. PAT——1030. 完美数列

    给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列. ...

  9. PAT 1030 完美数列

    https://pintia.cn/problem-sets/994805260223102976/problems/994805291311284224 给定一个正整数数列,和正整数 p,设这个数列 ...

  10. PAT(B) 1030 完美数列 - C语言 - 滑动窗口 & 双指针

    题目链接:1030 完美数列 (25 point(s)) 给定一个正整数数列,和正整数 \(p\),设这个数列中的最大值是 \(M\),最小值是 \(m\),如果 \(M≤mp\),则称这个数列是完美 ...

随机推荐

  1. python and or用法

    and 和 or 是python的两个逻辑运算符,可以使用and , or来进行多个条件内容的判断.下面通过代码简单说明下and  or的用法: 1. or:当有一个条件为真时,该条件即为真.逻辑图如 ...

  2. Javascript 查找元素

    DOM定义了多种查找元素的方法,除了我们常用的getElementById(),还有getElementsByTagName()和getElementsByName().使用这几种方法方法我们可以查找 ...

  3. JAVA文件的两种读取方法和三种写入方法

    在使用java对文件进行读写操作时,有多种方法可以使用,但不同的方法有不同的性能. 此文对常用的读写方法进行了整理,以备不时之需. 1.文件的读取 主要介绍两种常用的读取方法.按行读取和按字符块读取. ...

  4. iOS 之 设置横竖屏及ViewWillAppear及视图与导航控制器嵌套时的不同反应

    设置横竖屏不成功,可能跟所在导航控制器有关 视图没有导航控制器时,又有可能不调用ViewWillAppear,这是我遇到的问题.

  5. 请使用支持 JDBC 4.0 的 sqljdbc4.jar 类库

    转载请使用支持 JDBC 4.0 的 sqljdbc4.jar 类库 1.下载最新的JDBC(2012/3/6) http://www.microsoft.com/downloads/zh-cn/de ...

  6. 网上搜集的一段php可逆加密函数

    php加密函数: function my_encrypt($data, $key='unun.in') { $char = $str = ''; $key = md5($key); $x = 0; $ ...

  7. CentOS-6.6下Tomcat-7.0安装与配置(Linux)

    CentOS-6.6下Tomcat-7.0安装与配置(Linux) 一.认识tomcat Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目, ...

  8. js架构设计模式——由项目浅谈JS中MVVM模式

    1.    背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...

  9. multipathd dead but pid file exists

    构建RAC环境时出现的错误 百度半天未找到解决方案,Google了一下,终于找到可行方案 Solution:- yum update device-mapper glibc -y [root@HE2 ...

  10. Cocos2d-x 多分辨率支持

    最近遇到多分辨率支持问题,所以查了一些资料.将一些收获共享一下,以便自己和其他需要的朋友日后参考. 如果我要建立一个cocos2d-x项目,我的目标是支持iphone3G( 480, 320 ),ip ...