Codeforces Round #616 (Div. 2) C. Mind Control

題目連接:http://codeforces.com/contest/1291/problem/Cios

思路:spa

咱們能夠很容易想到,只有前m-1我的才能影響m的選擇的大小,後面的人沒法影響。code

若是全部人都沒法控制,那麼選數狀況的不可控性很大,因而若是咱們能夠控制k我的,讓他們的選擇被咱們控制,blog

那麼,可控性隨之上升,咱們知道,只有前m-1我的能影響m的選擇,因而,咱們應該儘量多的控制前m-1我的,ci

因而,咱們能夠控制的人數應該是x=min(k,m-1),若是x = m-1,說明m前面的全部人均可以控制,那就是可控的狀況了,get

咱們就能夠枚舉x我的的選擇狀況,好比有3我的選了前3個數,那麼x-3我的選了後x-3個數,ansi = max(a[4],a[n-(x-3)])。io

最後的答案應該是end_ans = max(end_ans,ans1,ans2...ansm-1)一個for循環就能夠搞定。for循環

若是x < m-1,及有y = m-1-k我的的選擇不肯定,說明有了隨機性,那麼我就在上面能夠肯定的狀況中枚舉全部的隨機選擇,class

對於隨機狀況咱們須要選擇最小值。由於ans要求的是任何狀況的ans至少是多少。test

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 int main(){
 6 
 7     int a[4000];
 8     int n,m,k,p,T;
 9     cin >> T;
10     while(T--){
11         cin >> n >> m >> k;
12         for(int i = 1; i <= n; ++i) cin >> a[i];
13         k = min(k,m-1);//可控制的人數
14         p = max(m-1-k,0);//不可控制的人數
15         int ans = -1;
16         for(int i = 0; i <= k; ++i){//i我的選前面的數,可控制的人
17             int tmp_ans = (int)1e9+10;
18             for(int j = 0; j <= p; ++j){//j我的選前面的數,不可控制的人
19                 tmp_ans = min(tmp_ans,max(a[i+j+1],a[n-(k-i)-(p-j)]));
20             }
21             ans = max(ans,tmp_ans);
22         }
23         cout << ans << endl;
24     }
25 
26     return 0;
27 }
相關文章
相關標籤/搜索