Let's denote a kk-step ladder as the following structure: exactly k+2k+2 wooden planks, of which
- two planks of length at least k+1k+1 — the base of the ladder;
- kk planks of length at least 11 — the steps of the ladder;
Note that neither the base planks, nor the steps planks are required to be equal.
For example, ladders 11 and 33 are correct 22-step ladders and ladder 22 is a correct 11-step ladder. On the first picture the lengths of planks are [3,3][3,3] for the base and [1][1] for the step. On the second picture lengths are [3,3][3,3] for the base and [2][2] for the step. On the third picture lengths are [3,4][3,4] for the base and [2,3][2,3] for the steps.
You have nn planks. The length of the ii-th planks is aiai. You don't have a saw, so you can't cut the planks you have. Though you have a hammer and nails, so you can assemble the improvised "ladder" from the planks.
The question is: what is the maximum number kk such that you can choose some subset of the given planks and assemble a kk-step ladder using them?
The first line contains a single integer TT (1≤T≤1001≤T≤100) — the number of queries. The queries are independent.
Each query consists of two lines. The first line contains a single integer nn (2≤n≤1052≤n≤105) — the number of planks you have.
The second line contains nn integers a1,a2,…,ana1,a2,…,an (1≤ai≤1051≤ai≤105) — the lengths of the corresponding planks.
It's guaranteed that the total number of planks from all queries doesn't exceed 105105.
Print TT integers — one per query. The ii-th integer is the maximum number kk, such that you can choose some subset of the planks given in the ii-th query and assemble a kk-step ladder using them.
Print 00 if you can't make even 11-step ladder from the given set of planks.
4 4 1 3 1 3 3 3 3 2 5 2 3 3 4 2 3 1 1 2
2 1 2 0
Examples for the queries 1−31−3 are shown at the image in the legend section.
The Russian meme to express the quality of the ladders:
题解: n 个木棍,搭建 k 步梯的条件:
1.有 k + 2个木头
2.k + 2 个木头中选取最大的两个基地
3.剩下的有多少个木头小于基地中最小的木头。
核心方程:min(a[n-1]-1,min(a[n-2]-1,n-2))
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 int main() 7 { 8 int T,a[100010]; 9 while(~scanf(" %d",&T)) 10 { 11 memset(a,0,sizeof(a)); 12 while(T--) 13 { 14 int n; 15 scanf(" %d",&n); 16 for(int i = 0; i < n; i++) 17 scanf("%d",&a[i]); 18 sort(a,a+n); 19 cout<<min(a[n-1]-1,min(a[n-2]-1,n-2))<<endl; 20 } 21 } 22 return 0; 23 }