1085. Perfect Sequence

来源:互联网 发布:人体测量尺寸数据 编辑:程序博客网 时间:2024/05/18 20:06

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


0 0