Codeforces Round #616 (Div. 2) C. Mind Control
题目链接:http://codeforces.com/contest/1291/problem/C
思路:
我们可以很容易想到,只有前m-1个人才能影响m的选择的大小,后面的人无法影响。
如果所有人都无法控制,那么选数情况的不可控性很大,于是如果我们可以控制k个人,让他们的选择被我们控制,
那么,可控性随之上升,我们知道,只有前m-1个人能影响m的选择,于是,我们应该尽可能多的控制前m-1个人,
于是,我们可以控制的人数应该是x=min(k,m-1),如果x = m-1,说明m前面的所有人都可以控制,那就是可控的情况了,
我们就可以枚举x个人的选择情况,比如有3个人选了前3个数,那么x-3个人选了后x-3个数,ansi = max(a[4],a[n-(x-3)])。
最后的答案应该是end_ans = max(end_ans,ans1,ans2...ansm-1)一个for循环就可以搞定。
如果x < m-1,及有y = m-1-k个人的选择不确定,说明有了随机性,那么我就在上面可以确定的情况中枚举所有的随机选择,
对于随机情况我们需要选择最小值。因为ans要求的是任何情况的ans至少是多少。
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 }
1
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步