题目翻译

我们对于 $n$ 个数 $a_1,a_2,...,a_n$,每个数可以选择标记为 RedBlue

对于颜色 $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;
}
最后修改:2023 年 04 月 22 日
v我50吃疯狂星期四