【杂题集】【51NOD 1267】4个数和为0

4个数和为0 

链接:

        原题

题意:

            ... 这

思路:

        由于(n=1000),O(n^2)的算法也可一试。

        于是求任意两数的和,转化为两数之和问题,再判断重复即可。

        但我感觉这道题略坑?总感觉我的代码有问题...

 

代码:

#include<iostream>
#include<algorithm>
using namespace std;

struct FormNumber {
    int num;
    int a,b;
};

int N,FN;
int Num[1000+100];
FormNumber FNum[499500+100];

bool FormNumberCmp (FormNumber a,FormNumber b) {
    if (a.num==b.num)
        if (a.a<b.a)
            return a.b<b.b;
        else return a.a<b.a;
    else return a.num<b.num;
}

inline bool IsFormNumberNotOver (FormNumber a,FormNumber b) {
    if ((a.a!=b.a)&&(a.b!=b.b)&&(a.a!=b.b)&&(a.b!=b.a)) return true;
  return false;   
}

int main () {
    ios::sync_with_stdio(false);
    cin>>N;
    for(int i=1; i<=N; i++) cin>>Num[i];
    for(int i=1; i<N; i++)
        for(int j=i+1; j<=N; j++)
            FNum[++FN]=(FormNumber) {Num[i]+Num[j],i,j};
    sort(FNum+1,FNum+FN+1,FormNumberCmp);
    int l=1,r=FN;
    while (l<r) {
        if (FNum[l].num+FNum[r].num==0&&IsFormNumberNotOver(FNum[l],FNum[r])) {
            cout<<"Yes";
            return 0;    
        }
        if (FNum[l].num+FNum[r].num>0) r--;
        else l++;
    }
    cout<<"No";
    return 0;
}

 

原文地址:https://www.cnblogs.com/Ztraveler/p/7046019.html