基准时间限制: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 <bits/stdc++.h> 2 #define N 1005 3 using namespace std; 4 int k[N],n; 5 bool Find(int a){ 6 int begin=0,end=n-1; 7 while(begin<=end){ 8 int mid=(begin+end)>>1; 9 if(k[mid]>a){ 10 end=mid-1; 11 }else if(k[mid]<a){ 12 begin=mid+1; 13 }else{ 14 return true; 15 } 16 } 17 return false; 18 } 19 int main(){ 20 scanf("%d",&n); 21 for(int i=0;i<n;i++){ 22 scanf("%d",&k[i]); 23 } 24 sort(k,k+n); 25 bool prime=true; 26 for(int i=0;i<n;i++) 27 for(int j=i+1;j<n;j++){ 28 int ans=-(k[i]+k[j]); 29 if(ans<=k[j]) 30 break; 31 if(Find(ans)){ 32 prime=false; 33 printf("%d %d %d ",k[i],k[j],ans); 34 } 35 } 36 if(prime) 37 printf("No Solution "); 38 return 0; 39 }