A题思维题(晚上断电停网,只写了签到的QAQ),还是比较容易的。首先分析条件:
根据条件,其实我们猜也能猜到梯子必须有两边的木头作为支架,所以这个题上面就加了两个条件来限制这个两边长度和中间step的木板长度;(其实看题还是有点夸张,梯子中间的木板长度不能小于1m?大部分我们以前的竹梯子中间嵌进去的柱子才半米的样子,题上说的应该是那种三脚架的钢梯吧。)
根据题的条件我们令梯子左边的长度为L1,右边的长度为L2.中间长度为L中,那么可以根据题目条件列出:
所以很显然了,如果要存在K那么就必须满足一个数组里面的最大两个值经过不等式子算出来K(K>=1),
所以我们很容易知K的取值范围在[1,min(L1-1,L2-1)],但是如果min(L1-1,L2-1)大于了n-2那肯定不行咯,因为k最多才n-2。
因为题上说了a[i]>=1所以没有必要去计算数组里面还有长度小于1的值的个数了。
AC代码
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
return a>b;
}
int main(){
int T,L1,L2,n,a[100010],flag=0;
scanf("%d",&T);
while(T--){
flag=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n,cmp);
int M=min(a[0]-1,a[1]-1);
for(int k=M;k>=1;k--){
if(k<=n-2){//判断是不是满足约束条件
printf("%d\n",k);
flag=1;//标记是否进来过
break;
}
}
if(!flag) printf("0\n");//如果没有满足条件的K那么久输出0
}
return 0;
}