codeforces做题记录--C. 3SUM Closure

C. 3SUM Closure

刚开始是硬着头皮写的暴力+二分搜索,不出意料的超时了

后来想着排序后在前两个数不变的情况下可以用指针指向前一次的结果,并在此基础上向后遍历,但感觉复杂度不会降低多少

但在这个过程中,我才发现如果有3个及以上个正数的话,最大的那三个数之和一定不在数组中,换而言之,如果数组有不小于3个的正数,那一定不行,负数同理

(结果还是超了

于是看题解,哦,原来个数>=2的0和2个0没有区别,可以删除 

#include<iostream>
#include<vector>
#define ll long long
const ll inf=0x3f3f3f3f;
using namespace std;
int numf,numz,num0;//负数个数,正数个数,0个数
void solve(vector<int>a)
{
    if(numf>2||numz>2)
    {
        cout<<"NO"<<endl;
        return ;
    }
    else
    {
        for(int i=0; i<a.size(); i++)
            for(int j=i+1; j<a.size(); j++)
                for(int k=j+1; k<a.size(); k++)
                    for(int m=0; m<a.size(); m++)
                        if(a[i]+a[j]+a[k]==a[m])
                            break;
                        else if(m==a.size()-1)
                        {
                            cout<<"NO"<<endl;
                            return;
                        }
    }
    cout<<"YES"<<endl;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        numf=numz=num0=0;
        int n,bo=1;
        cin>>n;
        vector<int>a;
        for(int i=0; i<n; i++)
        {
            int ans;
            cin>>ans;
            if(ans!=0||num0<=2)//这么写可以避免全部都是0时size<3(虽然没影响
                a.push_back(ans);
            if(ans<0)
                numf++;
            if(ans>0)
                numz++;
            if(ans==0)
                num0++;
        }
        solve(a);
    }
    return 0;
}

做完这题感觉自己好像又明白了什么,但不知具体,故保留以便日后回看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值