PTA 乙级——1030 完美数列 C++实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_45677518/article/details/102073950

题目 完美数列

给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。

现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。

输入格式:
输入第一行给出两个正整数 N 和 p
其中 N(≤10^​5​​)是输入的正整数的个数
p(≤10^9​​)是给定的参数
第二行给出 N 个正整数,每个数不超过 10^​9。

输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。

输入样例:

10 8
2 3 20 4 5 1 6 7 8 9

输出样例:

8

代码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	int N, p;
	cin >> N >> p;
	vector <int> list;
	for (int i = 0; i < N; i++)
	{
		int temp;
		cin >> temp;
		list.push_back(temp);
	}
	sort(list.begin(), list.end());    //   按顺序排列

	int prefect = 0;      //   可以选择完美数列的最大个数   
    int j = 0;            //   防止第四个测试点运行超时

	for (int i = 0; i < N; i++)    //   循环嵌套找到最大prefect
	{
		long long int mp = (long long)list[i] * p;

		if (list[N - 1]<=mp)    //   最后一个数仍小于等于mp时,不用进入内层循环
		{
			prefect = max(prefect, N - i);
			break;
		}
		for (j; j < N; j++)
		{
			if (list[j]>mp)
			{
				prefect = max(prefect, j - i);
				break;
			}
		}
	}

	cout << prefect;

}

写这个题的时候思路不难,用了两个循环嵌套找最大的prefect,结果有两个测试点一直过不去,一个报运行超时,一个报答案错误。

测试点四那个运行超时把最后一个数的判断和break提前了一下,然后把内层循环改成每次从上一次循环的j之后开始就过了。

然后是测试点五的答案报错,发现是mp长度不够,万一两个 1 0 9 10^{9} 次方相乘超出了int存储范围。

一开始我把他定义成了long long int,然而还是报错,找了半天之后发现右端其实还是两个int相乘,得到的结果还是int,心情复杂,右边也给他来一下就过了。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45677518/article/details/102073950
今日推荐