1085. Perfect Sequence

两天没刷题= =昨天这道题折腾了我一晚上,排序好后一开始用的递归,测试点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];
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值