题目难点分析
思路没啥难点,重点在于测试点4的超时解决
1.超时点1:对输入数的排序算法,我一开始用的插入算法,最后用的快排。
2.超时点2:循环的控制
for( ; j>=0; j--)
{
for( i =j-max;i>=0;i--)
{
if(a[j] <= a[i] * p)
dif = j - i + 1;
if(dif > max) max = dif;
else break;
}
}
printf("%d",dif);
我是逐一比较后找出其中最大的,但并不是真的需要逐一比较。因为当你找出一个符合的数字数目后,剩下的如果差距比它小,则没必要继续比了,因此有break的条件
完整代码
#include<stdio.h>
void quicksort(int *arr,int n)
{
if(n<2) return;
int base=arr[0];
int left=0;
int right=n-1;
int which=2;//2表示移动右下标,1表示移动左下标
while(left<right)
{
if(which==2)
{
if(arr[right]>=base) {right--;continue;}
else if(arr[right]<base)
{
arr[left]=arr[right];
left++;
which=1;
continue;
}
}
if(which==1)
{
if(arr[left]<=base) {left++;continue;}
else if(arr[left]>base)
{
arr[right]=arr[left];
right--;
which=2;
continue;
}
}
}
arr[left]=base;
quicksort(arr,left);//对基准数左边的区间进行再排序递归
quicksort(arr+left+1,n-left-1);//对基准数右边的区间进行再排序递归
}
int main()
{
int n=0;
long long p=0;
scanf("%d %lld",&n,&p);
int a[n],i=0,j=n-1,dif=1,max=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
quicksort(a,n);
for( ; j>=0; j--)
{
for( i =j-max;i>=0;i--)
{
if(a[j] <= a[i] * p)
dif = j - i + 1;
if(dif > max) max = dif;
else break;
}
}
printf("%d",dif);
}