By Jalan
题干
给一序列正整数和一个正整数p
如果序列中的Max<=Min*p那么这个序列是完美序列
现在给一个序列和p找出最可能多数字的组成完美序列
输入条件
第一行有两个正整数,数字个数N[0,10^ 5],p[0,10^ 9]是参数p,
第二行有N个正整数每个在[0,10^9]之间
输出条件
输出完美序列里的最大数
题解
注意测试点5,p*min的值可能超过int
第一次
思路
排序一下二分一个一个找
预期时间复杂度
nlogn
编写用时
30分钟自己写了一个测试点5没过,看别人的
代码
CPP
#include <cmath>
#include <set>
#include <cstdio>
#include <algorithm>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
const int maxn = 1e5 + 100;
int n, p, a[maxn];
int _binary_search(double num)
{
int l = 0, r = n - 1;
while (l <= r)
{
int mid = (l + r) >> 1;
if (a[mid] == num)
return mid;
if (a[mid] > num)
r = mid - 1;
if (a[mid] < num)
l = mid + 1;
}
return l;
}
int main()
{
scanf("%d%d", &n, &p);
for (int i = 0; i < n; i++)
scanf("%d", a + i);
sort(a, a + n);
int ans = 0;
for (int i = n - 1; i >= 0; i--)
{
int pos = _binary_search((double)a[i] / (double)p);
if (ans < i - pos + 1)
ans = i - pos + 1;
}
printf("%d\n", ans);
}
运行用时
第二次
思路
在比较的时候做个小优化,用最长长度去找
预期时间复杂度
编写用时
看别人的
代码
CPP
代码来自GitHub用户littlesevenmo
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
long long p;
scanf("%d%lld", &n, &p);
vector<int> v(n);
for (int i = 0; i < n; i++)
cin >> v[i];
sort(v.begin(), v.end());
int result = 0, temp = 0;
for (int i = 0; i < n; i++)
{
for (int j = i + result; j < n; j++)
{
if (v[j] <= v[i] * p)
{
temp = j - i + 1;
if (temp > result)
result = temp;
}
else
{
break;
}
}
}
cout << result;
return 0;
}
运行用时
结尾
看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀@.@