[51nod1267]4个数和为0(预处理+双指针)

题意:判断能否从序列中找出4个数的和为0。

解题关键:n^2预处理任意两个数的和,sort一下,双指针进行判定。

此解法尚存在一个问题,就是左右枚举的时候如果相同的有许多的时候该左边移动还是右边移动

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[1002];
struct node{
    int x,y,sum;
}arr[1000002];
bool cmp(node &a,node &b){
    return a.sum<b.sum;
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    int k=0;
    for(int i=0;i<n;i++) for(int j=0;j<i;j++){
        arr[k].x=i;
        arr[k].y=j;
        arr[k].sum=a[i]+a[j];
        k++;
    }
    sort(arr,arr+k,cmp);
    int l=0,r=k-1;
    bool flag=false;
    while(l<r){
        if(arr[l].sum+arr[r].sum==0&&arr[l].x!=arr[r].x&&arr[l].x!=arr[r].y&&arr[l].y!=arr[r].x&&arr[l].y!=arr[r].y){
            flag=true;
            break;
        }
        else if(arr[l].sum+arr[r].sum<0){
            l++;
        }else{
            r--;
        }
    }
    if(flag) printf("Yes\n");
    else printf("No\n");
    return 0;
} 

 

posted @ 2017-11-04 22:25  Elpsywk  阅读(225)  评论(0编辑  收藏  举报