【杂题集】【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;
}
时间: 2024-08-07 08:38:51

【杂题集】【51NOD 1267】4个数和为0的相关文章

51nod 1090 3个数和为0 &amp; 51nod 1267 4个数和为0(标记二分)

题目意思: 3个数的和为0: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1090 给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3个数的组合.如果没有这样的组合,输出No Solution.如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序. Input 第1行,1个数N,N为数组的长度(0 <= N <= 1000) 第2 -

51nod 1267 4个数和为0

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No". Input 第1行,1个数N,N为数组的长度(4 <= N <= 1000) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9) Output 如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出&q

51Nod - 1267 4个数和为0(暴力,思维)

题目链接 ??这题\(n\leq 1000\),首先我想的是直接枚举三个值然后二分找第\(4\)个数,但是显然复杂度肯定是不能接受的.那么只能继续降复杂度了...如果把这些数做一下预处理的话,可以\(n^2\)求出两个数一组的所有情况,然后分别从两头枚举,两数之和为0,肯定一个小一个大,我们将所有组合组成的数排序从两头枚举肯定能枚举出所有的情况,所以只要判定一下在枚举到中间以前能不能有一个答案符合要求就行了. const int maxn = 1e6+10; struct INFO { int

[51nod] 1267 4个数和为0 暴力+二分

给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No". Input 第1行,1个数N,N为数组的长度(4 <= N <= 1000) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9) Output 如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出"No". Input示例 5 -1 1 -5 2 4 Output

51 nod 1267 4个数和为0

1267 4个数和为0 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  取消关注 给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No". Input 第1行,1个数N,N为数组的长度(4 <= N <= 1000) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9) Output 如果可以选出4个数,使得他们的和为0,则输出

1267 4个数和为0

1267 4个数和为0 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No". Input 第1行,1个数N,N为数组的长度(4 <= N <= 1000) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9) Output 如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输

51nod 1090 3个数和为0【二分】

1090 3个数和为0 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3个数的组合.如果没有这样的组合,输出No Solution.如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序. Input 第1行,1个数N,N为数组的长度(0 <= N <= 1000) 第2 - N + 1行:A[i](-10^9 &l

51nod 1090 3个数和为0(排序+二分)

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1090 首先将序列进行排序,然后根据a+b+c=0,c=-a-b,二分查找c,注意判重,即c>b. 时间复杂度O(n*n*logn). #include<bits/stdc++.h> using namespace std; int n,a[1005]; int find(int x) { int l=0,r=n-1; while(l<=r) { int

51nod 1267 二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1267 1267 4个数和为0 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No". Input 第1行,1个数N,N为数组的长度(4 <= N <= 1000) 第2 - N + 1行: