1085 Perfect Sequence (25 分)
Given a sequence of positive integers and another positive integer p. The sequence is said to be a perfect sequence if M≤m×pwhere M and m are the maximum and minimum numbers in the sequence, respectively.
Now given a sequence and a parameter p, you are supposed to find from the sequence as many numbers as possible to form a perfect subsequence.
Input Specification:
Each input file contains one test case. For each case, the first line contains two positive integers N and p, where N (≤105) is the number of integers in the sequence, and p (≤109) is the parameter. In the second line there are N positive integers, each is no greater than 109.
Output Specification:
For each test case, print in one line the maximum number of integers that can be chosen to form a perfect subsequence.
Sample Input:
10 8
2 3 20 4 5 1 6 7 8 9
Sample Output:
8
思路:可以形成的完美数列有很多,题目是要求找出可以形成的最长的完美数列的长度。我第一遍读题理解为:输出以第一个数为首形成的完美数列中的最大的数,刚好也是8,卡了好久。之前做B1030的时候也没怎么卡,英语理解能力有待提高,样例设置得也有一定迷惑性。
10 8
2 3 20 4 5 1 6 7 8 9
排完序:
1 2 3 4 5 6 7 8 9 20
以第0个数字为首的完美数列的长度为:8
以第1个数字为首的完美数列的长度为:8
以第2个数字为首的完美数列的长度为:8
以第3个数字为首的完美数列的长度为:7
以第4个数字为首的完美数列的长度为:6
以第5个数字为首的完美数列的长度为:5
以第6个数字为首的完美数列的长度为:4
以第7个数字为首的完美数列的长度为:3
以第8个数字为首的完美数列的长度为:2
以第9个数字为首的完美数列的长度为:1
先将输入的数字按照从小到大排列,分别找到以每个数字为首的完美数列的长度,输出其最大值。寻找以每个数字为首的完美数列的长度时,其实就是寻找有序数列中第一个大于当前第一个数字乘上给定参数的数的位置,使用二分查找即可。
#include <bits/stdc++.h>
using namespace std;
long long in[100005];
int main()
{
long long n, p;
scanf("%lld%lld", &n, &p);
for(int i = 0; i < n; i++)
scanf("%lld", in + i);
sort(in, in + n);//将输入的数从小到大排序
int max = 1;//最少有1个(最大值)
for(int i = 0; i < n; i++)
{ //计算以in[i]为第一个数的完美数量的长度
int left = i;
int right = n;
int mid;
while(left < right)
{
mid = (right + left) / 2;
if(in[mid] > in[i] * p)
right = mid;
else
left = mid + 1;
}
//此时left和right大小相等
if(right - i > max)//当前完美数列长度较大
max = right - i;
}
printf("%d", max);
return 0;
}