PAT乙级 1030. 完美数列(25)
1030. 完美数列(25)
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。
现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数N和p,其中N(<= 105)是输入的正整数的个数,p(<= 109)是给定的参数。第二行给出N个正整数,每个数不超过109。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
第一个版本
#include "stdio.h"
void sort(double a[],int n);
void swap(double *a,double *b);
int main(int argc, char const *argv[])
{
double a[],p;
int i,n;
scanf("%d %lf",&n,&p);
getchar();
for(i=;i<n;i++)
scanf("%lf",&a[i]);
sort(a,n);
for(i=n-;i>;i--)
{
if(a[i]<=(a[]*p))
{
break;
} }
printf("%d\n",i+ );
return ;
}
void sort(double a[],int n)
{int i,j;
for(i=;i<n;i++)
{for(j=i+;j<n;j++)
{
if(a[i]>a[j])
swap(a+i,a+j);
}
} }
void swap(double *a,double *b)
{
double temp;
temp=*a;
*a=*b;
*b=temp; }
第二个版本
#include "stdio.h"
#include "stdlib.h"
int cmp(void const *a,void const*b);
int main(int argc, char const *argv[])
{
double *a,p;
int i,j,n,count=;
while(~scanf("%d %lf",&n,&p))
{
a=(double*)malloc(n*sizeof(double));
for(i=;i<n;i++)
scanf("%lf",&a[i]); qsort(a,n,sizeof(double),cmp);
for(i=;i<n;i++)//遍历将a[i]作为最小值
for(j=i+count;j<n;j++)//
{
if(a[j]>(a[i]*p))
break;
if(j-i+>count)
count=j-i+;
}
printf("%d\n",count );
free(a);
}
return ;
}
int cmp(void const *a,void const*b)
{
return *((double*)a)-*((double*)b);
}
思路:首先p与最小数相乘可能会超出int范围,所以这里用double,其次我们应该先将数组排序以方便计算,然后我们用双重for循环查找,查找的思路是从第一个元素作为最小数,开始往后找最大数,直到不符合条件,记录下此时的长度,然后将第二个元素作为最小数,再继续找,最后比较长度的最大值并输出,但是这样会超时,所以我们要对她进行优化,减少不必要的循环,优化的思路如下:
首先我们同样保持第一个for循环遍历最小值,在第二个for循环中我们将j置为前一个元素作为最小数时候的长度,这样就减少了小于上一次的不必要的for循环,j依然小于 N,用一个if判断是否符合条件,用另一个if判断此次是否大于上次的长度,比如说我们把样例中的数据已经排好序:1 2 3 4 5 6 7 8 9 20 ,此时我们将array[0]作为最小数,依次向后遍历,最大数j-最小数i+1即为数列的长度,最终找到8为最大的数,此时数列长度count为8,在将a[1]作为最小数的时候,我们直接将j置为1+8为9,直接比较a[1]和a[9]作为最小最大值得时候是否满足,不满足则a[1]最为最小数的时候并不能使数列变得更长,则继续再看a[2],这样等到有大于8的时候再更新,就可以
参考http://blog.csdn.net/wanmeiwushang/article/details/51456488
PAT乙级 1030. 完美数列(25)的更多相关文章
- PAT 乙级1030 完美数列(25) C++版
1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...
- PAT Basic 1030 完美数列 (25 分)
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...
- PAT (Basic Level) Practise (中文)-1030. 完美数列(25)
PAT (Basic Level) Practise (中文)-1030. 完美数列(25) http://www.patest.cn/contests/pat-b-practise/1030 给 ...
- PAT-乙级-1030. 完美数列(25)
1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...
- PAT(B) 1030 完美数列 - C语言 - 滑动窗口 & 双指针
题目链接:1030 完美数列 (25 point(s)) 给定一个正整数数列,和正整数 \(p\),设这个数列中的最大值是 \(M\),最小值是 \(m\),如果 \(M≤mp\),则称这个数列是完美 ...
- PAT 1030. 完美数列(25)
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列. ...
- PAT (Basic Level) Practice (中文)1030 完美数列 (25 分) (有点意思)
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...
- 1030 完美数列 (25 分)C、Java、python
题目描述 给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完 ...
- P 1030 完美数列
转跳点:
随机推荐
- 简单的form表单
效果 html <ul class="edit_list"> <li><em>*</em><span class=" ...
- cell的imageVIew的fram问题
今天你在输出cell的imageVIew的fram时,发现新建的cell的imageVIew的frame是(0,0,0,0),但是重用的cell的imageVIew的frame输出是(15,19,30 ...
- win2008主机IIS7.x 关于web.config设置301重定向
win2008主机IIS7.x 关于web.config设置301重定向 要求:windows主机是IIS7.0或以上的版本 方法如下: 在网站的根目录下新建web.config文件并将一下代码加入到 ...
- No mapping found for HTTP request with URI [] in DispatcherServlet with name 'appServlet'
项目是使用SpringMVC (1)在浏览器中访问,后台总报错: No mapping found for HTTP request with URI [] in DispatcherServlet ...
- Jackson:fasterxml和codehaus的区别
Jackson fasterxml和codehaus的区别: 它们是jackson的两个分支.也是两个版本的不同包名.jackson从2.0开始改用新的包名fasterxml:1.x版本的包名是cod ...
- 打印出1,11,21,31,41。。。。。。的shell脚本
打印出1,11,21,31,41......的shell脚本 方法一:#!/bin/bash ;i<;i=i+));do echo $i #cat -n /etc/services | sed ...
- php命名空间详解
index.php: <?php include 'demo.php'; use A\demo as test; use B\demo as test2; use C\demo; $obj = ...
- Foundation of 3D computer Graphics--Reading notes
2.1 几何数据类型 向量表示两个点之间的移动,点表示位置. 2.2 向量,坐标向量和基 向量$\overrightarrow{v}$ ,坐标向量c,基向量$\overrightarrow{b^{t} ...
- C语言下WebService的使用方式
用gSoap工具: 1.在dos环境中到gSoap工具对应的目录gsoap_2.8.18\gsoap-2.8\gsoap\bin\win32路径下,执行wsdl2h -c -o *.h ht ...
- Java遇见HTML——JSP篇之JavaWeb简介
一.什么是WEB应用程序 Web应用程序是一种可以通过Web(互联网)访问的应用程序.Web应用程序的一个最大好处是用户很容易访问应用程序.用户只需要有浏览器即可,不需要再安装其他软件. 为什么要学习 ...