PAT乙级 1030 完美数列 测试点3.4

一、题目

二、代码

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(long long a, long long b) {
	return a < b;
}
int main() {
	long long n, p;
	cin >> n >> p;
	long long num = 0, temp = 0;
	vector<long long>v(n);
	for (int i = 0; i < n; i++) {
		cin >> v[i];
	}
	//从小到大排序
	sort(v.begin(), v.end());
	if (n == 1) {
		num = 1;
	}
	for (long long i =0; i <n; i++) {
		for (long long j = i+num; j <n; j++) {
			if (v[j] <= p * v[i]) {
				temp = j - i + 1;
				if (temp > num)
                {num = temp;}
            }else {
					break;
				}
		}
	}
	cout << num;
}

三、分析

读题分析: 

数字的值可能特别大,10^9和10^5之内,都是正整数

找最大最小,满足M<=mp

猜测规律:

假设数字为1 2 3 4 5 6 7 8,p=2

最小为1,最大为8,当不满足M<=mp时,最小变大/最大变小

判断正误方法
最大为8,8不变,最小变大
8<=2*11变大
8<=2*22变大
8<=2*33变大
8<=2*4数字为4 5 6 7 8
最大变小为7,最小变大
7<=2*17变小,1变大
7<=2*22变大
7<=2*33变小
7<=2*4数字为4 5 6 7

所以,要找到最大和最小数字,最小变大,直到满足条件——>找到最大,最大/p(有小数进一位),找到最接近的数为满足条件的最小数

即8/2=4,最接近4的为4,最小数为4,输出4-8之间的个数;

20/8=2,有余数就加1,找最接近(2+1)的数为3,3-20中间有8个数字。

 测试用例和正确结果:

1.                  2.

测试点3:(一个数字)

测试点4:(超时)

初始num和temp都=0

四、如果没有重复数字就正确的代码:

#include <iostream>
#include<vector>
using namespace std;
int main() {
	long long n, p;
	cin >> n >> p;
	vector<long long>v(n);
	long long max = 0;//找到最大
	long long min;//记录最小
	for (int i = 0; i < n; i++) {
		cin >> v[i];
		if (v[i] >= max)max = v[i];
	}
	//得到最小数
	if (max % p != 0) {
		min = max / p + 1;
	}
	else {
		min = max / p;
	}
	//记录数量
	long long num = 0;
	for (int i = 0; i < n; i++) {
		if (v[i] >= min&&v[i]<=max) {
			num++;
		}
	}
	cout << num;
}

当时测试点4错了,

都说4时双层循环超时,可是我只用单层循环,从0到n,25ms感觉没超时

然后发现了问题,可能出现重复的数字

即:

10 8

25 20 8 7 6 5 3 3 3 1

输出为6,但是正确结果为8

所以改代码!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值