题目描述

北雷老中医给出大面包一个长度为N的无序数组,数组中的元素为整数。如果大面包从中找出一个和 = 0的3个数的组合颜值就能+1。如果没有这样的组合,输出Ren Chou Jiu Gai Duo Du Shu!。

由于大面包希望他的颜值最高,他需要求出所有和=0的3个数的组合,并把它们按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。大面包想变得和主席亮一样帅,请大家帮忙。

保证输入的数组不包含重复元素。

 

输入

多组数据 

对于每组数据:

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

 

输出

如果没有符合条件的组合,输出Ren Chou Jiu Gai Duo Du Shu!。
如果有多个组合,需要全部输出。顺序按照3个数中最小的数从小到大排列,如果最小的数相等则继续按照第二小的数排序。每行3个数,中间用空格分隔,并且这3个数按照从小到大的顺序排列
--正文
排序后枚举前两个数,使用lowerbound二分查找第三个数
(PS:STL确实省事)
 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int a[1005],n;

int main(){
    while (scanf("%d",&n) != EOF){
        int i,j;
        for (i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        int has = 0;
        for (i=0;i<n-2;i++){
            for (j=i+1;j<n-1;j++){
                int sum = a[i]+a[j];
                int pos = lower_bound(a+j+1,a+n,-sum) - a;
                //printf("%d %d %d\n",sum,pos,a[pos]);
                if (pos < n && a[pos] == -sum){
                    has = 1;
                    printf("%d %d %d\n",a[i],a[j],a[pos]);
                }
            }
        }
        if (!has) printf("Ren Chou Jiu Gai Duo Du Shu!\n");
    }
    return 0;
}

 

posted on 2016-11-16 11:10  Crutain  阅读(143)  评论(0编辑  收藏  举报