1. 程式人生 > >1090 3個數和為0

1090 3個數和為0

check ide clas main 排序 getc none sed 分享

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) {;}
代碼

1090 3個數和為0