题目链接:点击查看

题目大意:给出一个数组 a ,现在要求选出一个长度恰好为 k 的子序列 s ,使得的值最小

题目分析:当知道了 k 的大小之后,就可以计算出子序列奇数位置和偶数位置各有多少个数了,我们记为 k1 和 k2 ,因为我们要让尽量小,换句话说就是要让里面的两个 max 的其中一个尽量小就可以了,所以奇数列和偶数列实际上是没有任何交集的,这样一来我们可以分开考虑,我们的目标是让最大值最小,这显然是一个二分可以解决的问题,只不过在 check 函数中需要注意几个细节:

  1. 在遍历数组 a 时,不能选择相邻的两个数:也就是数 a[ i ]  被选择时,数 a[ i - 1 ] 和 a[ i + 1 ] 皆不能被选择
  2. 当 k1 == k2 时,说明子序列是从奇数开始,以偶数结尾,换句话说最后一个数一定不能是奇数,第一个数也一定不能为偶数,所以奇数的选择范围是 [ 1 , n - 1 ] ,偶数的选择范围是 [ 2 , n ]
  3. 当 k1 != k2 时,子序列是奇数开始,奇数结尾,原理同上,奇数的选择范围是 [ 1 , n ] ,偶数的选择范围是 [ 2 , n - 1 ]

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;int n,k,a[N],k1,k2;bool check(int l,int r,int x,int target)//检查区间[l,r]内小于等于x的数是否大于等于target个
{int cnt=0;for(int i=l;i<=r;i++)if(a[i]<=x)cnt++,i++;return cnt>=target;
}int solve(int L,int R,int target)
{int l=1,r=inf,ans;while(l<=r){int mid=l+r>>1;if(check(L,R,mid,target)){ans=mid;r=mid-1;}elsel=mid+1;}return ans;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);scanf("%d%d",&n,&k);k1=(k+1)/2,k2=k/2;for(int i=1;i<=n;i++)scanf("%d",a+i);printf("%d\n",min(solve(1,k1==k2?n-1:n,k1),solve(2,k1==k2?n:n-1,k2)));return 0;
}

CodeForces - 1370D Odd-Even Subsequence(二分+思维)相关推荐

  1. Codeforces 797B - Odd sum

    B. Odd sum 题目链接:http://codeforces.com/problemset/problem/797/B time limit per test 1 second memory l ...

  2. [codeforces 1364B] Most socially-distanced subsequence 绝对值脱壳的4种形态

    Codeforces Round #649 (Div. 2)  参与排名人数11286 [codeforces 1364B]   Most socially-distanced subsequence ...

  3. codeforces 808 E. Selling Souvenirs (dp+二分+思维)

    题目链接:http://codeforces.com/contest/808/problem/E 题意:最多有100000个物品最大能放下300000的背包,每个物品都有权值和重量,为能够带的最大权值 ...

  4. CodeForces - 51C 修信号站_思维+二分答案

    题目 给你x轴上的n个点,可以用三段相同长度的区间进行覆盖,问你这三个区间的最小长度是多少,并输出三段区间的中点. 求解 前半个问题应该不难,直接二分答案即可,后半个问题则有些思维成分.另外,这题让我 ...

  5. Anton and Fairy Tale CodeForces - 785C(二分+思维)

    Anton likes to listen to fairy tales, especially when Danik, Anton's best friend, tells them. Right ...

  6. Codeforces Round #703 (Div. 2) D . Max Median 二分 +思维

    传送门 题意: 给定一个数组和k,求一段连续区间中位数最大值,连续区间长度>=k. 如果=k的话可以直接秒了,这里是>=k,我们可以通过二分让后利用>=k这个条件来检查答案. 二分中 ...

  7. 【Codeforces 1157F】 Maximum Balanced Circle | 思维、dp、二分

    题目大意: 给出一个序列aia_iai​,序列中选出若干个数使它们满足下面条件: 按一定规则排序成为一个环后,任意相邻两项绝对值相差≤1\le 1≤1 输出最多能选择多少个数,并将这些数按照合法的规则 ...

  8. Codeforces Round #645 (Div. 2) D - The Best Vacation 题解(二分+思维)

    题目链接 题目大意 一年有n个月,每个月有d[i]天,让你找出连续x天,使其日期的总和最大,可以跨年 题目思路 这里要发现一个性质:即连续的x天一定满足最后一天在月份的结尾,结论是显然的. 然后用两个 ...

  9. CodeForces #649 B. Most socially-distanced subsequence(思维、规律)

    Most socially-distanced subsequence 题目大意:(文末原题) 给出一个长度为n的数组整型数组,输出使 相邻项的差 的绝对值 的和 最大,数组长度最小 的字串及其长度: ...

最新文章

  1. C#windows服务开发
  2. c++学习笔记之指向对象的指针以及对象数组
  3. 开发 OpenAM Java 客户端
  4. 谷歌查询mysql,谷歌地图:使用mysql查询更新标记不起作用
  5. [Java] 蓝桥杯ADV-202 算法提高 最长公共子序列
  6. PRICAI 2016 论文精选 | 基于车辆优先级优化交通系统的道路分布
  7. Cognos 11.0快速开发指南 Ⅱ
  8. Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0
  9. Cesium加载OSGB数据
  10. 低智商社会,娱乐至死,2书推荐,世界12大理论,
  11. 大一就开始这样刷题后,我成了同学们眼中的 offer 收割机
  12. pycharmSDK is not defined for Run Configuration 解决
  13. elk替代_记一次关于elk收集的日志中把手机号码用***代替遇到的问题以及解决
  14. OpenCV绘制透明底的图片,简单易懂讲解alpha通道怎么用
  15. 第19组 Beta(2/3)
  16. electron 弹窗
  17. 操作系统知识点总结(一)
  18. 什么是组合,作用是什么?
  19. 界面设计的八条黄金法则
  20. JUnit 实战第二版 中文目录

热门文章

  1. 文件上传下载-修改文件上传大小
  2. Nginx的rewrite案例之防盗链
  3. RabbitMQ各个名词介绍
  4. ChannelInitializer 的添加
  5. Spring-Cloud中常见的服务组件
  6. 保存课程图片-服务端开发
  7. MapReduce案例-wordcount-步骤分析
  8. 创建表空间创建用户以及用户授权
  9. 初始化方法-在类的外部给对象增加属性的隐患
  10. 抽屉效果_宜家靠边,好用不贵的全格收纳抽屉使用感受