PAT---完美数列


由于数值比较大,选用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---完美数列的更多相关文章
- PAT (Basic Level) Practise (中文)-1030. 完美数列(25)
		
PAT (Basic Level) Practise (中文)-1030. 完美数列(25) http://www.patest.cn/contests/pat-b-practise/1030 给 ...
 - 牛客网PAT练兵场-完美数列
		
题目地址:https://www.nowcoder.com/pat/6/problem/4056 题解:先将a数组进行排序,第一次按题意M<=n*p;n=a[0]时,M最大为J(如下图),然后n ...
 - PAT 1030. 完美数列(25)
		
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列. ...
 - PAT (Basic Level) Practise:1030. 完美数列
		
[题目链接] 给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一 ...
 - PAT乙级   1030. 完美数列(25)
		
1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...
 - PAT 乙级1030 完美数列(25) C++版
		
1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...
 - PAT B1030 完美数列 (25 分)
		
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...
 - PAT——1030. 完美数列
		
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列. ...
 - PAT 1030 完美数列
		
https://pintia.cn/problem-sets/994805260223102976/problems/994805291311284224 给定一个正整数数列,和正整数 p,设这个数列 ...
 - PAT(B) 1030 完美数列 - C语言 - 滑动窗口 & 双指针
		
题目链接:1030 完美数列 (25 point(s)) 给定一个正整数数列,和正整数 \(p\),设这个数列中的最大值是 \(M\),最小值是 \(m\),如果 \(M≤mp\),则称这个数列是完美 ...
 
随机推荐
- ABP架构解析
			
ABP总体介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...
 - UVa 11631 - Dark roads
			
题目大意:政府为了减小开支决定关闭一些路灯,同时保证照亮的路能连接所有路口. 又是一个MST问题,Kruskal算法,不过数据规模比较大,又Submission Error了...扔这吧... #in ...
 - border-radius归纳
			
一.基本语法 1.1 语法 解释 border-radius:10px 将创建四个大小一样的圆角. border-radius:10px 15px 10px 5px; 四个值分别表示左上角.右上角.右 ...
 - OC强弱引用的使用规则
			
强弱引用的唯一区别只是体现在对象的消亡上. 当一个对象不再有强引用指向它时,它就会被销毁. 弱引用不持有对象,不计入自动引入计数,所以不用考虑它销毁的问题.
 - spark使用总结
			
背景 使用spark开发已有几个月.相比于python/hive,scala/spark学习门槛较高.尤其记得刚开时,举步维艰,进展十分缓慢.不过谢天谢地,这段苦涩(bi)的日子过去了.忆苦思甜,为了 ...
 - JVM 参数设置
			
YGC FGC 都会影响程序的运行,中断程序,JVM参数调整比较复杂,现在记录了一下平时常用的JVM参数: jar 包启动: usr/java/bin/java -jar -Xms2560m -Xmx ...
 - HDU-1102-Constructing Roads(并查集)
			
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1102 这题大意就不讲了, 这题很容易,不过我做的很不爽,一个下午,一直WA,后来才发现数组开小了 只开 ...
 - 我用Cocos2d-x模拟《Love Live!学院偶像祭》的Live场景(一)
			
同样从CSDN搬过来 博客开这么久了,就发过一篇很水的文章,一直想写点正式的东西.这次准备开工一个仿其他游戏的简单小游戏,于是开博客把开发过程记录下来.这一系列文章主要讲,我是如何从零开始使用Coco ...
 - easyUI 初始化的两种方式
			
easyUI 初始化的两种方式: class方式和js方式: <!DOCTYPE html> <html lang="en"> <head> & ...
 - ZooKeepr日志清理
			
http://blog.csdn.net/xiaolang85/article/details/21184293