PAT 1030. 完美数列(25)

xiaoxiao2021-02-28  22

题目概述: 给定一个正整数数列,和正整数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

思路: 排序后穷尽所有情况 通过ans记录每次的最优情况,减少循环次数 注意p*m会超出32位,所以要使用long int防止溢出

这道题有点不明白为什么要用两个for,既然p是正整数, 那用最小值和最大值的关系进行判断不就可以了吗?

#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; int main() { long int N, p; long int ary[100005]; int ans; scanf("%ld%ld", &N, &p); if (N == 0) { printf("%ld", N); return 0; } ans = 1; for (int i = 0; i < N; i++) scanf("%ld", &ary[i]); sort(ary, ary + N); for (int i = 0; i < N; i++) { for (int j = i + ans; j < N; j++) { if (ary[j] <= ary[i] * p) { ans++; if (ans < j - i + 1) ans = j - i + 1; } else break; } } printf("%d", ans); return 0; }
转载请注明原文地址: https://www.6miu.com/read-2619625.html

最新回复(0)