题意:从数组中选出一个长度为 k k k的子序列,组成一个新的数组 a a a,要求该数组 a a a的 m i n ( m a x { a 1 , a 3 , a 5 } , m a x { a 2 , a 4 , a 6 } ) min(max\{a_1,a_3,a_5\},max\{a_2,a_4,a_6\}) min(max{a1,a3,a5},max{a2,a4,a6})最小
思路:假设这个答案为 x x x,则 x x x只能取原数组中的某个数,答案最多为 n n n种,且这 n n n个答案具有大小关系,可以按照从小到大排序,且值越大,其限制条件越少,越容易出现。现在要求最小值,因为满足单调性,可以采取check()二分
CHECK原理:
代码:
const int maxn=2e6+7;
const int INF=1e9;
const ll INFF=1e18;
int n,k,a[maxn];
bool check(int x)
{
int cnt=0;
rep(i,1,n)
{
if (cnt%2)
{
if (a[i]<=x)cnt++;
}
else cnt++;
}
if (cnt>=k)return true;
cnt=0;
rep(i,1,n)
{
if (cnt%2==0)
{
if (a[i]<=x)cnt++;
}
else cnt++;
}
if (cnt>=k)return true;
return false;
}
int main()
{
scanf("%d%d",&n,&k);
rep(i,1,n)scanf("%d",&a[i]);
int l=1,r=INF;
while(l<r)
{
int mid=(l+r)>>1;
if (check(mid))r=mid;
else l=mid+1;
}
W(l);
return 0;
}