这类题目归结于常用技巧与算法,有很鲜明的套路,重在理解其规则,通常写起来不算太复杂。
题目描述:
题目大意:
从N个正整数中选择若干个数,使得选出的这些数中的最大值不超过最小值的P倍,满足条件的选择方案中,选出的数的最大个数。
大致思路:
用vector数组接收序列值,要想用二分法,应首先对序列进行排序。
提交结果如下:
提交代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
long long n, p;
vector<long long> arr;
void func(int i, int& temp_len);
int main()
{
cin >> n >> p;
for (int i = 0; i < n; i++)
{
long long temp;
cin >> temp;
arr.push_back(temp);
}
sort(arr.begin(), arr.end());
int max_len = 0;
for (int i = 0; i < n; i++)
{
int temp_len;
func(i, temp_len);
if (temp_len > max_len)
{
max_len = temp_len;
}
}
cout << max_len << endl;
}
void func(int i, int& temp_len)
{
int low = i;
int high = n - 1;
while (low < high)
{
int mid = (low + high) / 2;
if (arr[mid] > arr[i] * p)
high = mid;
else
low = mid + 1;
}
int j = low;
if (arr[j] <= arr[i] * p)
{
temp_len = j - i+1;
}
else
temp_len = j - i;
}
本次提交后累计得分449,排名为15396。