#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j;
long int n,T,*p,*pout;
int max1,max2,maxpox;
scanf("%ld",&T);
pout=(long int*)malloc(T*sizeof(long int));
for(i=0;i<T;i++)
{
scanf("%ld",&n);
p=(long int*)malloc(n*sizeof(long int));
for(j=0;j<n;j++)
{
scanf("%d",&p[j]);
}
max1=max2=p[0];
for(j=1;j<n;j++)
{
if(p[j]>max1)
{
max1=p[j];
maxpox=j;
}
}
for(j=0;j<n;j++)
{
if(j!=maxpox&&p[j]>max2)
max2=p[j];
}
if(max2-1>=n-2&&n-2>=1)
pout[i]=n-2;
else if(max2-1<n-2&&max2-1>=1)
pout[i]=max2-1;
else
pout[i]=0;
free(p);
}
for(i=0;i<T;i++)
printf("%ld\n",pout[i]);
free(pout);
return 0;
}
题目分析:
由于各种输入量的数目都是不确定的,此题中为了节省内存空间,运用了两次动态分配。
要找出梯级的最大值,我们首先要找到最大和次大的俩木条,然后拿次大的木条减去1得到可安装的梯级数目,再拿这个数与剩余木条作比较,取其中较小的那个数。