PAT 乙级1030 完美数列(25) C++版


1030. 完美数列(25)

时间限制
300 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CAO, Peng

给定一个正整数数列,和正整数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

误区:将第一个作为最小值求结果,这个误区困扰了好久,说起来还是被例子绕晕了

比如说

10 8

1 3 9 11 15 17 18 18 19 20

这个答案就是9,从3开始的 3 9 11 15 17 18 18 19 20

思路:这题使用multiset容器最合适不过了,再求最大数目时,我们可以减少循环次数,比如

10 8
1 3 5 7 9 10 15 20 25 30
在将1作为最小之后,得出最大为4,在9处失败,
下一次将3做最小时,直接从9开始比对,因为第二个数大于等于第一个数(升序)
但是要将num减1,因为最小值右移一位了
从而节省了之前比对的次数

 1 // 1030.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include<iostream>
 6 #include<typeinfo>
 7 #include<set>
 8 
 9 using namespace std;
10 
11 int main()
12 {
13     int N, p, temp,num=0,max_num=0;
14     multiset<int> s;
15 
16     cin >> N >> p;
17 
18     for (int i = 0; i < N; ++i)
19     {
20         cin >> temp;
21 
22         s.insert(temp);
23     }
24 
25     multiset<int>::iterator i, j, t=s.begin(), begin = s.begin(), end = s.end();
26     int k , size = s.size();
27 
28     for (k=1,i = begin; k<=size; ++k,++i)
29     {
30         for (j = t; j != end; ++j)
31         {
32             if (static_cast<double>(*j) / p <= *i)//用除法做,防止越界
33                 ++num;
34             else
35                 break;
36         }
37 
38         t = j;//保留此次失败位置
39 
40         if (num > max_num)
41             max_num = num;
42 
43         --num;//因下一次循环是set里的数向后一位,所以减1
44     }
45 
46     cout << max_num << endl;
47 
48     return 0;
49 }

优质内容筛选与推荐>>
1、Sublime Text常用设置之个人配置
2、Convolutional Pose Machines
3、mongodb 入坑
4、Android invalidate() 和 postInvalidate()的区别
5、nat123动态域名解析软件使用教程


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn