1085. Perfect Sequence (25)
1.先对输入的数据进行排序
2.开始遍历所有情况,其中i从0开始遍历,求得j,使得num[j]<=num[i]*p,用二分法去查找j,把满足情况的都个数记录并取最大值
3.不用二分法的话,第5个测试点会超时
4.使用long long存储数据,后续的比较中,因为p<=10^9,num的最大值可以是10^9,超过32位int型,需要使用long long,才能通过最后一个测试点
AC代码如下:
//#include<string>
//#include <iomanip>
//#include<stack>
//#include<unordered_set>
//#include <sstream>
//#include "func.h"
//#include <list>
#include<unordered_map>
#include<set>
#include<queue>
#include<map>
#include<vector>
#include <algorithm>
#include<stdio.h>
#include<iostream>
#include<string>
#include<memory.h>
#include<limits.h>
using namespace std;
/*
7 10
1 10 11 12 13 14 15
10 8
2 3 20 4 5 1 6 7 8 9
2 1
2 3
10 0
2 3 20 4 5 1 6 7 8 9
*/
int main(void)
{
int n, p;
cin >> n >> p;
vector<long long> num(n);
for (int i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
int maxSize = 0;
sort(num.begin(), num.end());
for (int i = 0; i < n; i++)
{//从i=0开始遍历
long long tmp = num[i] * p;
int l = i;
int r = n - 1;
while (l <= r)
{//采用二分法查找
int mid = (l + r) / 2;
if (num[mid] <= tmp)
{
l = mid + 1;
maxSize = max(maxSize, mid + 1 - i);//满足情况的数值都进行比较
}
else
{
r = mid - 1;
}
}
}
cout << maxSize << endl;
return 0;
}

浙公网安备 33010602011771号