您的位置:首页 > 产品设计 > UI/UE

1085. Perfect Sequence

2017-01-04 14:48 288 查看
两天没刷题= =昨天这道题折腾了我一晚上,排序好后一开始用的递归,测试点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];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PAT