51nod 1090 3个数和为0

给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。
 

输入

第1行,1个数N,N为数组的长度(0 <= N <= 1000)
第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)

输出

如果没有符合条件的组合,输出No Solution。
如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则继续按照第二小的数排序。每行3个数,中间用空格分隔,并且这3个数按照从小到大的顺序排列。

输入样例

7
-3
-2
-1
0
1
2
3

输出样例

-3 0 3
-3 1 2
-2 -1 3
-2 0 2
-1 0 1



暴力加尺取,找出所有的三个数组合,每次选定一个数作为最小的,尺取找另两个满足条件的数。
代码:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int no;
int main() {
    int n;
    int s[1000];
    scanf("%d",&n);
    for(int i = 0;i < n;i ++) {
        scanf("%d",&s[i]);
    }
    sort(s,s + n);
    for(int i = 0;i < n - 2;i ++) {
        int l = i + 1,r = n - 1;
        while(l < r) {
            int d = s[l] + s[i] + s[r];
            if(d < 0) {
                l ++;
            }
            else if(d > 0) {
                r --;
            }
            else {
                printf("%d %d %d
",s[i],s[l],s[r]);
                no ++;
                l ++;
                r --;
            }
        }
    }
    if(!no) printf("No Solution");
}
原文地址:https://www.cnblogs.com/8023spz/p/10874023.html