1. 程式人生 > 實用技巧 >D. Odd-Even Subsequence

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