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\),则称这个数列是完美 ...
随机推荐
- leetcode day5
[242]Valid Anagram: Given two strings s and t, write a function to determine if t is an anagram of s ...
- JavaScript高级程序设计-8:BOM
1. 什么是BOM? BOM(Browser Object Mode) 是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的.可以与浏览器窗口进行互动的对象 ...
- Object修改链表
以前学习过链表的时候由于类型的接收不同,每次要重写链表 下面修改可用链表 class Link{ private class Node{ private Object data ; private N ...
- bzoj3052
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题目大意:自己看看,懒得写 题解:带修改的树上莫队,经典爆评测机的题 代码: #inc ...
- Unity中使用多构造函数
如果要实例化的类只有一个构造函数, 则使用方法很简单使用方法如下: 1 2 3 4 5 6 7 using (IUnityContainer container = new UnityContaine ...
- 如何解决Ajax跨域问题-1
如何解决Ajax跨域问题 最近在做AJAX调用C的问题,出现跨域问题,学习总结如下: 在做ajax读取数据的时候,经常会遇到ajax需要跨域的问题,但由于浏览器安全方面的限制,XMLHttpReque ...
- java 遍历List 和 Map的几种方法
java遍历List 1.(性能最差) for(String tmp:list) { //System.out.println(tmp); } 2.(性能最好) for(int i = 0; i &l ...
- Swift 添加到TableView实现动画效果
let indexPath = NSIndexPath(forRow:0 ,inSection:0) self.tableView.insertRowsAtIndexPaths([indexPath] ...
- mysql中游标的使用案例详解(学习笔记)
1.游标是啥玩意?简单的说:游标(cursor)就是游动的标识,啥意思呢,通俗的这么说,一条sql取出对应n条结果资源的接口/句柄,就是游标,沿着游标可以一次取出一行.我给大家准备一张图: 2.怎么使 ...
- LogBack log出力路径
转自:http://blog.csdn.net/z69183787/article/details/30284391 请看下面这段配置,这是无法工作的: <?xml version=" ...