一、题目
二、代码
#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*1 | 错 | 1变大 |
8<=2*2 | 错 | 2变大 |
8<=2*3 | 错 | 3变大 |
8<=2*4 | 对 | 数字为4 5 6 7 8 |
最大变小为7,最小变大 | ||
7<=2*1 | 错 | 7变小,1变大 |
7<=2*2 | 错 | 2变大 |
7<=2*3 | 错 | 3变小 |
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
所以改代码!!!!!!!
标签:PAT,测试点,max,最小,long,变大,3.4,num,include From: https://blog.csdn.net/hhhsyyy/article/details/141960209