51nod 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 Solution。如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则继续按照第二小的数排序。每行3个数,中间用空格分隔,并且这3个数按照从小到大的顺序排列。

Input示例

7

-3

-2

-1

0

1

2

3

Output示例

-3 0 3

-3 1 2

-2 -1 3

-2 0 2

-1 0 1

这道题看讨论说可以二分解决,但本弱渣想了会,感觉自己写不出来,所以用了个比较挫逼挫逼的做法。。

详情请看代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int a[10100];
struct node1
{
 int x,y,z;
};
bool cmp(node1 a,node1 b)
{
 if(a.x==b.x)
 return a.y<b.y;
 else
 return a.x<b.x;
}
int main()
{
 int n;
 while(scanf("%d",&n)!=EOF)
 {
  node1 qq[10100];
  for(int i=0;i<n;i++)
  {
   scanf("%d",&a[i]);
  }
  sort(a,a+n);
  int key;
  int flag=0;
     for(int i=0;i<n;i++)
     {
      if(a[i]>=0)
      {
          key=i;
          break;
      }
     }
     int cnt=0;
     for(int i=0;i<key;i++)
     {
       for(int j=i+1;j<key;j++)
       {
        for(int k=key+1;k<n;k++)
        if(a[i]+a[j]+a[k]==0)
        {
         qq[cnt].x=a[i];
         qq[cnt].y=a[j];
    qq[cnt].z=a[k];
    cnt++;
    //printf("%d %d %d ",qq[cnt].x,qq[cnt].y,qq[cnt].z);
         flag=1;
        }
       }
     }
     for(int i=0;i<key;i++)
     {
       for(int j=key;j<n;j++)
       {
        for(int k=j+1;k<n;k++)
        if(a[i]+a[j]+a[k]==0)
        {
         qq[cnt].x=a[i];
         qq[cnt].y=a[j];
    qq[cnt].z=a[k];
    cnt++;
          //printf("%d %d %d ",qq[cnt].x,qq[cnt].y,qq[cnt].z);
         flag=1;
        }
       }
     }
     sort(qq,qq+cnt,cmp) ;
     if(flag==0)
     {
      printf("No Solution ");
     }
     else
     {
      for(int i=0;i<cnt;i++)
      {
       printf("%d %d %d ",qq[i].x,qq[i].y,qq[i].z);
      }
     }
   }
   return 0;
}

原文地址:https://www.cnblogs.com/NaCl/p/9580219.html