先得到任意两个数的和,从小到大排序,从两边向中间扫一遍就行了
#include <stdio.h>
#include <algorithm>
using namespace std;
typedef long long ll;
int a[1005];
struct node{
int l,r;
ll sum;
}sum[1005 * 1005];
bool cmp(struct node a,struct node b){
return a.sum < b.sum;
}
int main(void){
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
int cnt = 0;
for(int i = 1;i <= n; i++){
for(int j = 1; j <= n; j++){
if(i == j){
continue;
}
//记录这两个数的下标
sum[cnt].l = i;
sum[cnt].r = j;
sum[cnt++].sum = a[i] + a[j];
}
}
sort(sum,sum + cnt,cmp);
int flag = 0;
int L = 0,R = cnt - 1;
while(L <= R){
ll temp = sum[L].sum + sum[R].sum;
//小于0说明小的那个数过于小了,所以小数向右移
if(temp < 0){
L++;
}
//大于0说明大的那个数过于大了,所以大数向左移
else if(temp > 0){
R--;
}
else{
//等于0时需要判断一下这四个数是否有重复的,如果有重复的,L,R都向中间移动一位
if(sum[L].l == sum[R].l || sum[L].l == sum[R].r ||
sum[L].r == sum[R].l || sum[L].r == sum[R].r){
L++;
R--;
}
//没有重复,直接退出
else{
flag = 1;
break;
}
}
}
if(flag == 1){
printf("YES\n");
}
else{
printf("NO\n");
}
return 0;
}