题目描述
北雷老中医给出大面包一个长度为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 ",sum,pos,a[pos]); if (pos < n && a[pos] == -sum){ has = 1; printf("%d %d %d ",a[i],a[j],a[pos]); } } } if (!has) printf("Ren Chou Jiu Gai Duo Du Shu! "); } return 0; }