CodeForces - 1291C Mind Control 动态规划

题意

给出一个长度为n的数组;

1 2 3 n

可以可控制的将数组去掉首位变成n-k长度;

i i+1 i+2 i+(n-k-1)

然后会不可控的将数组从首尾去掉元素变成n-m+1;

(i+j) (i+j)+1 (i+j)+2 (i+j)+(n-m)

然后我们取剩下的数组中首尾第一个元素中最大的;
问最坏情况我们可以取到的最大值;

思路

我们将数组变为长度(n-k-1)的方案是可控的,选取哪一种都可以,所以可以在子情况中选最优解(最大值);
之后我们将数组变为长度(n-m-1)时,是不可以控制,考虑最坏情况,我们取最劣解(最小值);

代码

#include<bits/stdc++.h>
using namespace std;
int a[300000];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        k=min(k,m-1);
        int s=n-m;
        int ans=-1;
        for(int i=0; i<=k; i++)//枚举可控制选取后留下的区间[i,i+n-k-1]
        {
            int Min=0x3f3f3f3f;
            for(int j=0; j<m-k; j++)//枚举现在的区间[i,i+n-k-1]中被任意选取后留下的区间[i+j,i+j+n-m+1]
            {
                int l=i+j,r=i+j+(n-m);//i+j是左端点,n-m为最后留下的区间长度
                Min=min(Min,max(a[l],a[r]));//因为是不可控的所以取最坏情况最小值;
                //cout<<l<<r<<endl;
            }
            ans=max(ans,Min);//因为前k个是可控的,所以取最大值
        }
        printf("%d\n",ans);
    }
    return 0;
}
//6 6 4 2 2 9 2 3 8 5

发布了19 篇原创文章 · 获赞 19 · 访问量 675

猜你喜欢

转载自blog.csdn.net/qq_44086097/article/details/104155549