• 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 }
  • 相关阅读:
    设计模式(17) 访问者模式(VISITOR) C++实现
    Effective C++(20) 继承与面向对象设计
    Google论文(1) GFS:Google文件系统
    设计模式(16) 观察者模式(OBSERVER)C++实现
    海量数据处理面试题(2) 将用户的query按出现频度排序
    海量数据处理面试题(1) 找出两文件种包含的相同的url
    深入探索C++对象模型(1) 关于对象(思维导图)
    服务器编程入门(13) Linux套接字设置超时的三种方法
    技术笔记:Indy的TIdSMTP改造,解决发送Html和主题截断问题
    技术笔记:Delphi多线程应用读写锁
  • 原文地址:https://www.cnblogs.com/cdp1591652208/p/7259430.html
Copyright © 2020-2023  润新知