C++ PAT乙级 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 <iostream>
#include <cmath>
//#include <iomanip>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

int main()
 {
    int N,p;
    cin >> N >> p;
    int arr[N];
    for(int i=0;i<N;i++)
        cin >> arr[i];
    sort(arr,arr+N);
    int num[N]={0},n=0;
    /*for(int i=0;i<N;i++)
    {
        for(int j=N-1;j>i;j--)
        {
            if( arr[j] > arr[i]*p ) continue;
            else { num[i] = j-i+1;break;}
        }
    }*///这种方法会超时
    for (int i=0;i<N;i++)
    {
        for(int j=i+n;j<N;j++)//加上n就保证n为最大个数
        {
            if(arr[j]>arr[i]*p) break;
            else n++;
        }
    }

    //int Max=*max_element(num,num+N);
    cout << n;
    return 0;
 }

发布了26 篇原创文章 · 获赞 0 · 访问量 158
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览