两天没刷题= =昨天这道题折腾了我一晚上,排序好后一开始用的递归,测试点3就超时了o(╯□╰)o百度到一个很巧妙的方法,从最小数开始试探,满足条件则范围扩大一点,不满足则缩小,一直到范围尾端扩大到最大数,中途记录最大范围。
#include<stdio.h>
#include<stdlib.h>
void HeapSort(long a[],int size);
void HeapAdjust(long a[], int i, int size);
int main()
{
int N, i=1,max=0;
long p;
scanf("%d %ld",&N,&p);
long *data = (long*)malloc(sizeof(long)*(N + 1));
while (i<=N)
scanf("%ld", &data[i++]);
HeapSort(data, N);/*形成递减数列*/
int j = i=N;
long long ans;
while (i > 0) {
ans = data[j] * p;
if (data[i] <= ans)
i--;
else j--;
if (max < j - i) max = j - i;
}
printf("%d",max);
return 0;
}
void HeapSort(long a[],int size)
{
int i;
for (i = size / 2; i > 0; i--) /*自下而上地调整堆*/
HeapAdjust(a, i, size);
for (i = size; i > 1; i--) {
a[0] = a[1];a[1] = a[i];a[i] = a[0];
HeapAdjust(a, 1, i-1);
}
}
void HeapAdjust(long a[], int i, int size)/*对结点i进行下滤*/
{
a[0] = a[i];/*a[0]不存放结点*/
int Parent=i,Child=2*Parent;
while( Child <= size) {/*当左孩子存在时*/
if ((Child < size) && (a[Child + 1] < a[Child]))
Child++;
if (a[Child] >= a[0])
break;
a[Parent] = a[Child];
Parent = Child; Child = 2 * Parent;
}
a[Parent] = a[0];
}