题目翻译
我们对于 $n$ 个数 $a_1,a_2,...,a_n$,每个数可以选择标记为 Red
或 Blue
。
对于颜色 $c$,Count(c)
表示颜色 $c$ 出现几次。
对于颜色 $c$,Sum(c)
表示标记为颜色 $c$ 的数字总和。
问是否存在 Sum(Red)
$>$ Sum(Blue)
且 Count(Red)
$<$ Count(Blue)
题目思路
个人认为像贪心。
我们尽量让多的个数和少的个数差距缩小,最好为 $1$,再让多的个数全选小的,少的个数全选大的,最大程度缩小差距。
题目代码
void solve()
{
int n;
cin>>n;
ll a[n+5];
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);//排序,更好区分大小
ll l=2,r=n,sl=a[1]+a[2],sr=a[n];//默认多的有两个,少的有一个,小的和默认为两个最小的,大的和默认一个最大的
bool f=0;//记录是否实现
if(sr>sl)//默认状态就实现,去输出
{
f=1;
goto check;
}
while(l+2<r)//每次左右都移一次,所以这里是+2
{
l++;
r--;
sl+=a[l];
sr+=a[r];
if(sr>sl)//判断
{
f=1;
break;
}
}
check:;
if(f==1)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}