第2 - N + 1行:A i i(-10^9 <= A i i <= 10^9)
如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则继续按照第二小的数排序。每行3个数,中间用空格分隔,并且这3个数按照从小到大的顺序排列。
7 -3 -2 -1 0 1 2 3
-3 0 3 -3 1 2 -2 -1 3 -2 0 2 -1 0 1
思路:这个和我以前做过的题很相识,那是两数想加,这个是三个数相加,这个稍微复杂了一些,不过中心思想都一样。有点像隐私图搜索。这个题,知道三个数的和为6,那么我们可以枚举其中两个已知,得到第三个数的大小,然后开始搜索这个数组里面有没有这第三个数?怎么样搜索呢?难道用dfs,加标记吗?(可能会超时),而且题目要求这3个数按照从小到大的顺序排列。所以你一定开始就用sort排序,而且枚举时一定是从最小的开始枚举,为了避免重复,那么第三个数一定在这枚举的两个数的后面的区间里面。那么再写一个调用函数用二分法查找,传递区间左侧,区间右侧为(n-1),开始查找。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define MAXN 1000+10 int num[MAXN]; int n; int F(int k,int m) { int left=k,right=n-1,mid; while(left<=right) { mid=(left+right)/2; if(m<num[mid]) right=mid-1; else if(m>num[mid]) left=mid+1; else return mid; } return -1; } int main() { while(~scanf("%d",&n)) { int flag=0; memset(num,0,sizeof(num)); for(int i=0; i<n; i++) scanf("%d",&num[i]); sort(num,num+n); for(int i=0; i<=n; i++) { for(int j=i+1; j<n; j++) { int term=F(j+1,0-num[i]-num[j]); if(term!=-1) printf("%d %d %d\n",num[i],num[j],0-num[i]-num[j]),flag=1; } } if(!flag) printf("No Solution\n"); } return 0; }