由于数值比较大,选用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. javascript中的__proto__和prototype

    一.2个参考网址: http://icekiller110.iteye.com/blog/1566768 http://www.cnblogs.com/snandy/archive/2012/09/0 ...

  2. windowsxp系统下SVN添加新用户

    以我部署的文件为例: 我在f盘下新建一个zzz文件夹将其部署为svn共享工程后,新来员工需要添加svn账号以获取工程. 总共三步begin: 1.进入工程文件夹ZZZ在里面有一个conf文件夹如图: ...

  3. var d = document.getElementById 错误

    var d = document.getElementById; var s = d("demo").innerHTML; alert(s); // IE 没有问题,其他浏览器必须 ...

  4. html5、css3及响应式设计入门

    一.响应式设计的定义 将三种已有的开发技巧(弹性网格布局.弹性图片.媒体和媒体查询)整合起来,命名为响应式网页设计.真正的响应式设计方法不仅仅只是根据视口大小改变网页布局.相反,它是要从整体上颠覆我们 ...

  5. Ubuntu16.04 FTP Server 完整篇

      sudo apt-get update #更新系统 sudo apt-get install vsftpd #安装vsftpd sudo systemctl status vsftpd #判断vs ...

  6. iOS 之 UIStackView

    UIStackView是iOS9新推出的布局控件,它的出现,可以说颠覆了以往的布局方式. 问题时,如果我使用UIStackView,它能用在iOS7.8系统中吗? 我要测试一下.测试程序我放到gith ...

  7. Spring 之 示例(Java之负基础实战)

    接 Spring 之 配置 里面的代码. 现在要进行Controller的开发. 1.引用类 import org.springframework.web.servlet.mvc.Controller ...

  8. redis 安装启动及设置密码<windows>

    redis 1. 安装 1.1 下载解压包,直接解压到任意路径下即可 windows下载地址:ttps://github.com/MSOpenTech/redis/releases 2.启动 2.1 ...

  9. 选择排序法-java详解案例

    /**  * 功能:选择排序法 * 思想:第一次从R[0]-R[N-1]中选取最小值,与R[0]交换,第二次从R[1]-R[N-1]中选取最小值,与R[1]交换, * 第三次从R[2]-R[N-1]中 ...

  10. apache的工作模式 和 最大连接数设置

    经过测试 效果明显 (1)首选查看apache的工作模式 windows下的查看apache的工作模式命令:httpd -l 如果列出mod_win32.c,则表示是 win32.c 工作方式. 列出 ...