假设这个序列存储于数组a[1000]中,那么暴力一下
#include "bits/stdc++.h"
using namespace std;
int a[1000],n=1000;
int main(){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
for(int l=0;l<n;l++){
if(a[i]+a[j]+a[k]==a[l]){
cout<<"Yes";
return 0;
}
}
}
}
}
cout<<"No";
return 0;
}
4个for,扎布多德勒(超时)
对式子(a+b+c=d)进行优化,a+b=d-c
将a+b这一部分和d-c这一部分 分开存储,排序后利用二分快速查找
#include "bits/stdc++.h"
using namespace std;
int n,a[1000];
set<int>add;
set<int>subtract;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[i]+a[j]<a[n-1])add.insert(a[i]+a[j]);
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[j]-a[i]>0)subtract.insert(a[j]-a[i]);
}
}
for(auto addit=add.begin();addit!=add.end();addit++){
if(subtract.find(*addit)!=subtract.end()){
cout<<"Yes";
return 0;
}
}
cout<<"No";
return 0;
}
set自带排序和二分查找
对于a+b部分来说 因为要满足a+b+c=d
所以a+b必须小于数组a中最大的那一个
对于d-c部分来说 因为数组元素大于1
所以d-c要大于0
原题:2022河南萌新联赛第(二)场 J-签到