PAT 1085. Perfect Sequence (25)

1085. Perfect Sequence (25)

时间限制
300 ms
内存限制
32000 kB
代码长度限制
16000 B
判题程序
Standard
作者
CAO, Peng

Given a sequence of positive integers and another positive integer p. The sequence is said to be a "perfect sequence" if M <= m * p where 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

思路:排序后二分搜索

 
#include <stdio.h>
#include <algorithm>
using namespace std;
long long int list[100010];
int N, p;

int fun(int num)
{
	long long int temp = list[num] * p;
	int a = -1, b = N, mid;
	while(b - a > 1)
	{
		mid = (a + b) / 2;
		/*if(temp == list[mid])
		{
			break;
		}*/
		if(temp < list[mid])
		{
			b = mid;
		}
		else
		{
			a = mid;
		}
	}
	return b - num;
}

int main()
{
	while(scanf("%d %d", &N, &p) != EOF)
	{
		for(int i = 0; i < N; i++)
		{
			scanf("%d", &list[i]);
		}
		sort(list, list + N);
		int max = 0, res = 0;
		for(int i = 0; i < N; i++)
		{
			if(list[i] > list[N - 1] / p || (list[N - 1] / p == 0 && list[i] == list[N - 1] / p))
			{
				res = N - i;
				max = max < res ? res : max;
				break;
			}
			res = fun(i);
			max = max < res ? res : max;
		}
		printf("%d\n", max);
	}
	return 0;
}


你可能感兴趣的:(PAT 1085. Perfect Sequence (25))