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\n",a[i],a[j],-a[i]-a[j]);
            }
        }
    }
    if(!t)
    {
        printf("No Solution\n");
    }
}

其他解法:

#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\n",a[i],a[j],a[k]);
                tag=false;
                j++;
                k--;
            }
        }
    }
    if(tag)
    {
        printf("No Solution\n");
    }
    return 0;
}
时间: 2024-10-10 12:45:33

51nod 1090 3个数和为0(排序+二分)的相关文章

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

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] 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

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 -

1090 3个数和为0 1091 线段的重叠 1182 完美字符串 1283 最小周长 1284 2 3 5 7的倍数

1090 3个数和为0 给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3个数的组合.如果没有这样的组合,输出No Solution.如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序. Input 第1行,1个数N,N为数组的长度(0 <= N <= 1000) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9) Output 如果没有符合条件的组合,输出No Solu

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 - 1267 4个数和为0(暴力,思维)

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

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

1001 数组中和等于K的数对 1090 3个数和为0

二分查找.对数组每个V[i],在其中查找K-V[i],查找完成后修改v[i]避免重复输出 #include<iostream> #include<algorithm> #include<vector> #include<cstdio> using namespace std; typedef long long LL; #define INF 0x3f3f3f3f int main() { vector<LL> vv; bool sign = f