D. Odd-Even Subsequence

https://codeforces.com/contest/1370/problem/D

题意:给定一个序列,让我们找一个大小为k的序列,求最小值

   最小值的定义为:min(奇数位置上的最大,偶数位置上的最小)

思路:二分

   对于check部分,我们分为两块来写,奇数位和偶数位

   先考虑奇数位置,我们找出满足奇数位置的个数和偶数位置的个数

   计算完毕后再比较,不成功的话再转向偶数位的计算,成功就直接跳出

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=2e5+10;
 4 int a[maxn];
 5 int n,k;
 6 int limitodd,limiteven;
 7 int check(int mid)
 8 {
 9     //先看奇数;
10     int flag=1;
11     int numodd=0;
12     int numeven=0;
13     for(int i=1;i<=n;i++){
14         if(flag==1){
15             if(a[i]<=mid){
16                 numodd++;
17                 flag=0;
18             }
19         }
20         else{
21             numeven++;
22             flag=1;
23         }
24     }
25     if(numodd>=limitodd&&numeven>=limiteven) return 1;
26     else{
27         numodd=1;
28         numeven=0;
29         flag=1;
30         for(int i=2;i<=n;i++){
31             if(flag==1){
32                 if(a[i]<=mid){
33                     numeven++;
34                     flag=0;
35                 }
36             }
37             else{
38                 numodd++;
39                 flag=1;
40             }
41         }
42         if(numodd>=limitodd&&numeven>=limiteven) return 1;
43         else return 0;
44     }
45 }
46 int main()
47 {
48     scanf("%d%d",&n,&k);
49     limiteven=k/2;
50     limitodd=k/2+k%2;
51     for(int i=1;i<=n;i++)
52         scanf("%d",&a[i]);
53     int L=1,R=1e9;
54     int ans;
55     while(L<=R){
56         int mid=L+R>>1;
57         if(check(mid)){
58             ans=mid;
59             R=mid-1;
60         }
61         else L=mid+1;
62     }
63     printf("%d\n",ans);
64     return 0;
65 }
View Code

 

posted @ 2020-07-22 14:06  古比  阅读(184)  评论(0编辑  收藏  举报