题目描述
目标: 你需要判断是否存在一种必胜策略。
游戏规则:
将一个包含 n 个正整数的数组 a 分成前后两部分(可以任意划分,但不能为空)。
你从前半部分最多选择 k1 个数,菲菲姐从后半部分最多选择 k2 个数。双方都必须选择至少一个数字。
如果你的数字的平均值大于菲菲姐数字的中位数,则你获胜,否则你输。
假设双方都采用最优策略,追求平均数和中位数最大化。
输入:
n, k1, k2:数组元素数量,你最多选择的数字数量,菲菲姐最多选择的数字数量。
a1, a2, …, an:数组中的 n 个正整数。
输出:
Yes:存在必胜策略。
No:不存在必胜策略。
样例
5 5 5
5 1 4 2 4
Yes
最优策略:k1和k2都没有用,因为想要得到最大的中位数和平均值,就要在可选择的范围内选择最大的数。对于数组划分的权利在我,所以我要尽可能将全数组中的最大值划给我&&菲菲姐不能有我和一样的最大值。
数组划分:前一半给我,后一半给菲菲姐,长度可以任意,但不能为空。所以直接将最后一个分给菲菲姐即可,因为这样才保证全局最大的数最大概率给我。只让菲菲姐选择最后一个数。因为数组的划分是前一半和后一半所以菲菲姐的可选择范围必定包含最后一个数。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 100010;
int a[N],n,k1,k2;
int main()
{
scanf("%d%d%d",&n,&k1,&k2);
int max = 0;
for(int i = 0; i < n; i ++)
{
scanf("%d",&a[i]);
if(max < a[i])
max = a[i];
}
if(max == a[n-1])
printf("No");
else
printf("Yes");
return 0;
}