[codeforces 1370D] Odd-Even Subsequence 二分查找+跳跃取数

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章