刚开始是硬着头皮写的暴力+二分搜索,不出意料的超时了
后来想着排序后在前两个数不变的情况下可以用指针指向前一次的结果,并在此基础上向后遍历,但感觉复杂度不会降低多少
但在这个过程中,我才发现如果有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;
}
做完这题感觉自己好像又明白了什么,但不知具体,故保留以便日后回看