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 <= 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
二分答案
枚举前两个数 二分第三个数
1 #include <cctype> 2 #include <cstdio> 3 #include <algorithm> 4 5 const int MAXN=1010; 6 7 int n; 8 9 int a[MAXN]; 10 11 bool flag; 12 13 inline void read(int&x) { 14 int f=1;register char c=getchar(); 15 for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar()); 16 for(;isdigit(c);x=x*10+c-48,c=getchar()); 17 x=x*f; 18 } 19 20 inline bool check(int x) { 21 int l=0,r=n+1; 22 while(l+1<r) { 23 int mid=(l+r)>>1; 24 if(a[mid]>=x) r=mid; 25 else l=mid; 26 } 27 if(a[r]==x) return true; 28 return false; 29 } 30 31 int hh() { 32 read(n); 33 for(int i=1;i<=n;++i) read(a[i]); 34 std::sort(a+1,a+1+n); 35 for(int i=1;i<=n;++i) 36 for(int j=i+1;j<=n;++j) { 37 int t=-a[i]-a[j]; 38 if(t<=a[j]) continue; 39 if(check(t)) { 40 flag=true; 41 printf("%d %d %d\n",a[i],a[j],t); 42 } 43 } 44 if(!flag) printf("No Solution\n"); 45 return 0; 46 } 47 48 int sb=hh(); 49 int main(int argc,char**argv) {;}