1 #include<bits/stdc++.h>
2 #define ll long long
3 #define INF 1e17
4 using namespace std;
5 const int N = 2e5 + 10;
6 ll n, k;
7 ll a[N];
8
9 bool check(ll mid, ll cur)
10 {
11 int len = 0;
12 for(int i = 1 ; i <= n ; i++){
13 if(cur){
14 if(a[i] <= mid){
15 len++;
16 cur ^= 1;
17 }
18 }else{
19 len++;
20 cur ^= 1;
21 }
22 }
23 return len >= k;
24 }
25
26 int main(){
27 scanf("%lld%lld",&n,&k);
28 for(int i = 1 ; i <= n ; i++){
29 scanf("%lld",&a[i]);
30 }
31 ll l = 1, r = INF;
32 while(l < r)
33 {
34 ll mid = (l + r) >> 1;
35 if(check(mid, 0) || check(mid, 1)){
36 r = mid;
37 }else{
38 l = mid + 1;
39 }
40 }
41 printf("%lld
",l);
42
43 return 0;
44 }
两个check进行T/F判断,对于类似10101或01010的情况,我只需要考虑取所有1位上的值中的最大作为最小,即res,而0位上的数值则可以任意选择;两个check刚好可以覆盖所有情况。