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 mid=l+r>>1;
    if(a[mid]==x) return 1;
    if(a[mid]<x) l=mid+1;
    else r=mid-1;
    }
    return 0;
}
main()
{
    int i,j,t=0,sum;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    sort(a,a+n);
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {
            sum=-a[i]-a[j];
            if(sum<=a[j])           //判重 
            break;
            if(find(sum))
            {
                t=1;
                printf("%d %d %d
",a[i],a[j],-a[i]-a[j]);
            }
        }
    }
    if(!t)
    {
        printf("No Solution
");
    }
}

 其他解法:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define ll long long
#define N 1005

ll a[N];

int main()
{
    ll n;
    scanf("%I64d",&n);
    for(ll i=0;i<n;i++)
    {
        scanf("%I64d",&a[i]);
    }
    sort(a,a+n);
    bool tag=true;
    for(ll i=0;i<n&&a[i]<0;i++)
    {
        for(ll j=i+1,k=n-1;j<n&&j<k;)
        {
            while(a[i]+a[j]+a[k]<0&&j<=k)
            {
                j++;
            }
            while(a[i]+a[j]+a[k]>0&&k>=j)
            {
                k--;
            }
            if(j>=k) break;
            if(a[i]+a[j]+a[k]==0)
            {
                printf("%I64d %I64d %I64d
",a[i],a[j],a[k]);
                tag=false;
                j++;
                k--;
            }
        }
    }
    if(tag)
    {
        printf("No Solution
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/CrazyBaby/p/5830683.html