这道题的基本思想是尺取,题目的原型大概是给出一组数,让你找到和值为特定值的两个数的组合。(尺取法:先排序,分别用一个first指针指向第一个数,last指针指向最后一个数,如果first指着的数+last指着的数<特定值,last不动,first++.。反之,first不动,last--,直到last和first相邻。)这里不过多了一个k-前面的值,然后再在剩下的值里面找和值为k-前面的值的组合。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1000+5;
int n;
int a[maxn],vis;
void ruler(int t,int k){
int first,last;
first=t+1;
last=n-1;
while(first!=last){
//cout<<"f:"<<first<<endl;
if(a[last]<k-a[first])
first++;
else if(a[last]>k-a[first])
last--;
else if(a[last]==k-a[first]){
printf("%d %d %d\n",a[t],a[first],a[last]);
vis=1;
first++;
}
}
}
int main(){
while(scanf("%d",&n)!=EOF){
vis=0;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
for(int i=0;i<n-1;i++)
ruler(i,0-a[i]);
if(vis==0)
printf("No Solution\n");
}
return 0;
}