码迷,mamicode.com
首页 > 其他好文 > 详细

CF 1370D 二分 2e5

时间:2020-11-17 12:50:15      阅读:11      评论:0      收藏:0      [点我收藏+]

标签:int   names   选择   color   its   font   main   style   while   

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define INF 1e17
 4 using namespace std;
 5 const int N = 2e5 + 10; 
 6 ll n, k;
 7 ll a[N];
 8 
 9 bool check(ll mid, ll cur)
10 {
11     int len = 0;
12     for(int i = 1 ; i <= n ; i++){
13         if(cur){
14             if(a[i] <= mid){
15                 len++;
16                 cur ^= 1;
17             }
18         }else{
19             len++;
20             cur ^= 1;
21         }
22     }
23     return len >= k;
24 }
25 
26 int main(){
27     scanf("%lld%lld",&n,&k);
28     for(int i = 1 ; i <= n ; i++){
29         scanf("%lld",&a[i]);
30     }
31     ll l = 1, r = INF;
32     while(l < r)
33     {
34         ll mid = (l + r) >> 1;
35         if(check(mid, 0) || check(mid, 1)){
36             r = mid;
37         }else{
38             l = mid + 1;
39         }
40     }
41     printf("%lld\n",l);
42     
43     return 0;
44 }

两个check进行T/F判断,对于类似10101或01010的情况,我只需要考虑取所有1位上的值中的最大作为最小,即res,而0位上的数值则可以任意选择;两个check刚好可以覆盖所有情况。

CF 1370D 二分 2e5

标签:int   names   选择   color   its   font   main   style   while   

原文地址:https://www.cnblogs.com/ecustlegendn324/p/13961430.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!