Codeforces Round #651 (Div. 2) 参与排名人数14559
[codeforces 1370D] Odd-Even Subsequence 二分查找+跳跃取数
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1370/problem/D
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
D - Odd-Even Subsequence | GNU C++17 | Accepted | 93 ms | 1000 KB |
题目大意:给定包含n个元素的数组a,选出k个元素,这些元素的前后顺序不变,组成数组b,找出在数组b在奇数位置的最大值,找出在数组b在偶数位置的最大值,在这两个最大值中,找最小值。因选取k个元素,组成数组b,有多种组合,要求在多种组合中,找出最小值,输出这个最小值。
样例模拟如下,可结合以下AC代码进行研究
6 4
5 3 50 2 4 5
3
a数组位置1 2 3 4 5 6
a数组数值5 3 50 2 4 5
只研究cnt=0,x=3这种情况:
从a数组第1个位置开始:cnt++,cnt=1
从a数组第2个位置开始尝试取值:cnt&1==1,a[2]=3<=3,cnt++,cnt=2,位置2参与取值,此时cnt=2
从a数组第3个位置开始:cnt++,cnt=3
从a数组第4个位置开始:cnt&1==1,a[4]=2<=3,cnt++,cnt=4,位置4参与取值,此时cnt=4
从a数组第5个位置开始:cnt++,cnt=5
从a数组第6个位置开始尝试取值:cnt&1==1,a[6]=5>3,位置6不参与取值,此时cnt=5
数组a遍历完毕,但cnt=5>=4,此次遍历成功,对应数组b的元素是3 50 2 4
b的奇数子序列是{3,2}对应最大值是3
b的偶数子序列是{50,4}对应最大值是50
最大值中取最小值是3
AC代码如下:
#include <cstdio>
#define maxn 200010
int a[maxn],n,k;
int judge(int x){
int i,cnt;
cnt=0;
for(i=1;i<=n;i++){
if(cnt&1){//从数组a的第2位元素开始尝试
if(a[i]<=x)cnt++;
}else cnt++;
}
if(cnt>=k)return 1;
cnt=0;
for(i=1;i<=n;i++){
if(!(cnt&1)){//从数组a的第1位元素开始尝试
if(a[i]<=x)cnt++;
}else cnt++;
}
if(cnt>=k)return 1;
return 0;
}
int main(){
int l,r,i,mid;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
l=0,r=1000000001;
while(l+1<r){
mid=(l+r)/2;
if(judge(mid))r=mid;
else l=mid;
}
printf("%d\n",r);
return 0;
}