二分法
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
vector<long long> arr;
int main()
{
int N, p;
scanf("%d%d", &N, &p);
int num;
for(int i = 0; i< N; i++)
{
scanf("%d", &num);
arr.push_back(num);
}
sort(arr.begin(), arr.end());
int ans = 1;
for(int i = 0; i< N; i++)
{
int j = upper_bound(arr.begin()+ i+1, arr.end() , (long long)arr[i]*p) - arr.begin();
ans = max(ans, j - i);
}
printf("%d", ans);
}
说实话这个题最开始题目都理解错了,然后六个采分点过了五个(???)
二分法原理知道的情况下还是lower_bound和upper_bound更省事,一个函数的是,省得自己分了
two Pointers
肛道理,我想到的最坏复杂度都是O(n2)
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> arr;
int main()
{
int N, p;
scanf("%d%d", &N, &p);
int num;
for(int i = 0; i< N; i++)
{
scanf("%d", &num);
arr.push_back(num);
}
sort(arr.begin(), arr.end());
//int left = 0, right = arr.size();
int left = 0, right = 0;
int count = 1;
while(right < N && left < N )
{
//printf("%I64d\n", ans);
if((long long )arr[right] - (long long)arr[left]*p <= 0)
{
count = max(count, right - left +1);
right++;
}
else
left++;
}
printf("%d", count);
}
看了思路以后自己实现的代码,和给的答案略有不同,看来还是做题做得少,应该要多加练习
附上自己做题时的思路代码,超时了QAQ
while(N - left >= len)
{
while((long long )arr[right] - (long long)arr[left]*p > 0)
{
right--;
}
len = max(len, right - left +1);
left++;
right = arr.size()-1;
}
printf("%d", len);
}