第三题:A. Least Product

#include

using namespace std;

void solve()
{
    int n;
    cin>>n;

    vector<int> q;

    while(n--)
    {
        int x;
        cin>>x;
        q.push_back(x);
    }

    int cnt_0=0,cnt_1=0,cnt_2=0;
    for(int e:q)
    {
        if(e==0)    cnt_0++;
        else if(e<0)    cnt_1++;
        else    cnt_2++;
    }

    int ans=0;
    if(cnt_0>0) ans=0;
    else
    {
        //没有0
        if(cnt_1<=0)
        {
            //没有负数
            ans=1;
        }
        else
        {
            if(cnt_1%2==0)  ans=1;//偶数
            else    ans=0;
        }
    }

    cout<<ans<<endl;
    if(ans==1)  cout<<1<<" "<<0<<endl;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin>>t;

    while(t--)
        solve();

    return 0;
}

自己其实一下子就想清楚了,但是连样例都过不去,情况太多了,本来以为难点在分类讨论,结果发现其实只有那么几种情况,一边分类讨论一边写注释可以帮助自己理清楚思路

还是不知道之前过不了样例的原因,不想看之前自己写的代码了

很多时候只需要输出任意一种情况,其实非常简单,就是把第一个元素变成0就行

乘积最小,要么是负数,要么是0

假设数组里面没有负数,需要操作一次,让一个数字变成0

假设数组里面有0,不需要操作,或者说怎么操作都是徒劳

假设数组里有负数,负数的个数是偶数,最后的乘积还是正数,所以需要操作一次,把一个数字变成0,负数的个数是奇数的话,不需要进行操作

你可能感兴趣的:(#,CF,div2,A题,算法)