CodeForces - 1370D Odd-Even Subsequence(二分+思维)
题目链接:点击查看
题目大意:给出一个数组 a ,现在要求选出一个长度恰好为 k 的子序列 s ,使得的值最小
题目分析:当知道了 k 的大小之后,就可以计算出子序列奇数位置和偶数位置各有多少个数了,我们记为 k1 和 k2 ,因为我们要让尽量小,换句话说就是要让里面的两个 max 的其中一个尽量小就可以了,所以奇数列和偶数列实际上是没有任何交集的,这样一来我们可以分开考虑,我们的目标是让最大值最小,这显然是一个二分可以解决的问题,只不过在 check 函数中需要注意几个细节:
- 在遍历数组 a 时,不能选择相邻的两个数:也就是数 a[ i ] 被选择时,数 a[ i - 1 ] 和 a[ i + 1 ] 皆不能被选择
- 当 k1 == k2 时,说明子序列是从奇数开始,以偶数结尾,换句话说最后一个数一定不能是奇数,第一个数也一定不能为偶数,所以奇数的选择范围是 [ 1 , n - 1 ] ,偶数的选择范围是 [ 2 , n ]
- 当 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(二分+思维)相关推荐
- Codeforces 797B - Odd sum
B. Odd sum 题目链接:http://codeforces.com/problemset/problem/797/B time limit per test 1 second memory l ...
- [codeforces 1364B] Most socially-distanced subsequence 绝对值脱壳的4种形态
Codeforces Round #649 (Div. 2) 参与排名人数11286 [codeforces 1364B] Most socially-distanced subsequence ...
- codeforces 808 E. Selling Souvenirs (dp+二分+思维)
题目链接:http://codeforces.com/contest/808/problem/E 题意:最多有100000个物品最大能放下300000的背包,每个物品都有权值和重量,为能够带的最大权值 ...
- CodeForces - 51C 修信号站_思维+二分答案
题目 给你x轴上的n个点,可以用三段相同长度的区间进行覆盖,问你这三个区间的最小长度是多少,并输出三段区间的中点. 求解 前半个问题应该不难,直接二分答案即可,后半个问题则有些思维成分.另外,这题让我 ...
- Anton and Fairy Tale CodeForces - 785C(二分+思维)
Anton likes to listen to fairy tales, especially when Danik, Anton's best friend, tells them. Right ...
- Codeforces Round #703 (Div. 2) D . Max Median 二分 +思维
传送门 题意: 给定一个数组和k,求一段连续区间中位数最大值,连续区间长度>=k. 如果=k的话可以直接秒了,这里是>=k,我们可以通过二分让后利用>=k这个条件来检查答案. 二分中 ...
- 【Codeforces 1157F】 Maximum Balanced Circle | 思维、dp、二分
题目大意: 给出一个序列aia_iai,序列中选出若干个数使它们满足下面条件: 按一定规则排序成为一个环后,任意相邻两项绝对值相差≤1\le 1≤1 输出最多能选择多少个数,并将这些数按照合法的规则 ...
- Codeforces Round #645 (Div. 2) D - The Best Vacation 题解(二分+思维)
题目链接 题目大意 一年有n个月,每个月有d[i]天,让你找出连续x天,使其日期的总和最大,可以跨年 题目思路 这里要发现一个性质:即连续的x天一定满足最后一天在月份的结尾,结论是显然的. 然后用两个 ...
- CodeForces #649 B. Most socially-distanced subsequence(思维、规律)
Most socially-distanced subsequence 题目大意:(文末原题) 给出一个长度为n的数组整型数组,输出使 相邻项的差 的绝对值 的和 最大,数组长度最小 的字串及其长度: ...
最新文章
- C#windows服务开发
- c++学习笔记之指向对象的指针以及对象数组
- 开发 OpenAM Java 客户端
- 谷歌查询mysql,谷歌地图:使用mysql查询更新标记不起作用
- [Java] 蓝桥杯ADV-202 算法提高 最长公共子序列
- PRICAI 2016 论文精选 | 基于车辆优先级优化交通系统的道路分布
- Cognos 11.0快速开发指南 Ⅱ
- Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0
- Cesium加载OSGB数据
- 低智商社会,娱乐至死,2书推荐,世界12大理论,
- 大一就开始这样刷题后,我成了同学们眼中的 offer 收割机
- pycharmSDK is not defined for Run Configuration 解决
- elk替代_记一次关于elk收集的日志中把手机号码用***代替遇到的问题以及解决
- OpenCV绘制透明底的图片,简单易懂讲解alpha通道怎么用
- 第19组 Beta(2/3)
- electron 弹窗
- 操作系统知识点总结(一)
- 什么是组合,作用是什么?
- 界面设计的八条黄金法则
- JUnit 实战第二版 中文目录