由于数值比较大,选用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. WCF不用证书实现验证(messageheader)

    上文WCF进阶:将消息正文Base64编码中介绍了实现自定义MessageInspector来记录消息和实现自定义Formatter来改写消息,本文介绍一下在WCF中使用SoapHeader进行验证的 ...

  2. BZOJ2720: [Violet 5]列队春游

    2720: [Violet 5]列队春游 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 173  Solved: 125[Submit][Status] ...

  3. iOS 参考 网络书籍

    网络图书: Xcode中的Project和Target: http://book.51cto.com/art/201307/402283.htm

  4. Bagging和Boosting 概念及区别

    Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法.即将弱分类器组装成强分类器的方法. 首先介绍Boot ...

  5. spring3.1........jar包下载

    1.common-dbcp-1.4.jar 下载地址:http://commons.apache.org/dbcp/ 2.common-pool-1.6.jar 下载地址:http://commons ...

  6. ubuntu修改环境变量

    1.修改/etc/profile后重启之后就失效了,需要修改/etc/environment才可以 以下情况是失败的: 在/etc/profile文件中添加变量[对所有用户生效(永久的)] 用VI在文 ...

  7. GCD教程(三):Dispatch Sources

    接上一篇,原帖地址:http://www.dreamingwish.com/dream-2012/intro-to-grand-central-dispatch-part-iii-the-dispat ...

  8. RMAN中FILESPERSET设置对备份速度的影响

    看到网上部分人说不指定FILESPERSET(默认值=64)则会导致分配的通道只走第一个而导致备份效率低下,今天仔细研究了一下,参照了多个博主文章,得出结论如下: 如果没有指定filesperset, ...

  9. 查看AIX是32位还是64位,查看内存、cpu等参数

    prtconf 64位也可以查看: ls -l /unix

  10. 在windows下安装运行disconf

    一.环境准备 1.下载disconf源码 (本文以2.6.36为例) https://github.com/knightliao/disconf 2.下载nginx1.10.2(windows版) h ...