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;
}


posted @ 2015-11-23 22:56  siukwan  阅读(185)  评论(0)    收藏  举报