码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-06-19 01:21:27      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:ble   51nod   nod   pre   ref   class   inline   syn   iostream   

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;
}

 

 

 

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

标签:ble   51nod   nod   pre   ref   class   inline   syn   iostream   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!