codeforces 1291C Mind Control 贪心+暴力

https://vjudge.net/problem/CodeForces-1291C
在这里插入图片描述
在这里插入图片描述题目大意:给 n n 个整数的数组 a a n n 个人依次选取数组的第一个元素或最后一个元素作为它的得分,你是第 m m 个选择的,你可以在游戏开始前指定 k k 个人选取第一个元素或最后一个元素(不要求 k k 个人保持一致 可以为每一个人指定)。问在这些人随意选择的情况下你的得分最低是多少。

思路:题目扯了一堆,其实就是让你求最坏情况。如果 k > = m 1 k>=m-1 ,那么显然答案是 a [ 1 m ] a[1……m] a [ n m + 1 n ] a[n-m+1……n] 中的最大值;如果 k < m 1 k<m-1 ,因为数据范围不大,所以我们可以枚举这 k k 个人选择的情况: k k 个人选最后一个; 1 1 个人选第一个, k 1 k-1 个人选最后一个;……; k k 个人选第一个。对于每种情况,剩下了 n k n-k 个人,且在你之前还有 m k 1 m-k-1 个人要选择,再用上述方式枚举这 m k 1 m-k-1 个人的选择即可。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

int t,n,m,k;
int a[3505];

int cal(int l,int r,int v)
{
    int ans=INF;
    for(int i=0;i<=v;i++)
        ans=min(ans,max(a[l+i],a[r-v+i]));
    return ans;
}

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        int ans=0;
        if(k>=m-1)
        {
            for(int i=1;i<=m;i++)
                ans=max(ans,a[i]);
            for(int i=n;i>n-m;i--)
                ans=max(ans,a[i]);
        }
        else
        {
            int num=m-k-1;
            ans=cal(1,n-k,num);
            for(int i=1;i<=k;i++)
                ans=max(ans,cal(i+1,n-k+i,num));
        }
        printf("%d\n",ans);
    }
    return 0;
}

发布了677 篇原创文章 · 获赞 30 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/xiji333/article/details/104223056