一开始思路是从N个数中取出3个,然后搜索是否distinct的和在S中。用DFS。TLE。
后来改变思路先在S中找和,然后再找xyz。找xyz的方法可以是遍历x,y用二分法找z,也可以是3SUM方法。
#include<iostream>
#include<algorithm>
using namespace std;
int *arr;
int size,input,dest,x,y,z,flag,sum;
int main(){
cin>>input;
while(input>0){
flag=0;
size=input;
arr = new int[size];
for(int i=0;i<size;i++){
cin>>input;
arr[i]=input;
}
sort(arr,arr+size);//increasing sort
for(int i=size-1;i>=0;i--){
dest=arr[i];
for(int j=size-1;j>=2;j--){
if(j==i)
continue;
if((arr[j]+arr[0]+arr[1])>dest)
continue;
x=j;
y=0;
z=j-1;
if(y==i)
y++;
if(z==i)
z--;
while(y<z){
sum = arr[x]+arr[y]+arr[z];
if(sum==dest){
flag=1;
goto END;
}else if(sum<dest){
y++;
if(y==i)
y++;
}else{
z--;
if(z==y)
z--;
}
}
}
/*
for(int j=0;j<size-2;j++){
x=j;
y=j+1;
z=size-1;
if(x==i)
continue;
if(y==i){
y++;
}
if(z==i){
z--;
}
while(y<z){
sum = arr[x]+arr[y]+arr[z];
if(sum==dest){
flag=1;
goto END;
}else if(sum<dest){
y++;
if(y==i)
y++;
}else{
z--;
if(z==y)
z--;
}
}
}
*/
}
END:
if(flag==1){
cout<<dest<<endl;
}else{
cout<<"no solution"<<endl;
}
delete arr;
arr=NULL;
cin>>input;
}
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
int *arr;
int size,input,dest,flag,cha;
bool search(int left,int right,int key,int i,int j)
{
int l = left,r = right;
while(l<=r)
{
int mid = (l+r)/2;
if(arr[mid] == key && mid!=i&&mid!=j)return true;
else if(arr[mid] < key)l = mid+1;
else if(arr[mid] > key)r = mid-1;
}
return false;
}
int main(){
cin>>input;
while(input>0){
flag=0;
size=input;
arr = new int[size];
for(int i=0;i<size;i++){
cin>>input;
arr[i]=input;
}
sort(arr,arr+size);//increasing sort
for(int i=size-1;i>=0;i--){
dest=arr[i];
for(int j=size-1;j>=0;j--){
if(j==i)
continue;
if((arr[j]+arr[0]+arr[1])>dest)
continue;
for(int k=j-1;k>=0;k--){
if(k==i)
continue;
cha = dest-arr[j]-arr[k];
if(search(0,k-1,cha,i,j)){flag = 1;goto END;}
//for(int t=0;t<size;t++){
// if((t!=i)&&(t!=j)&&(t!=k)&&(arr[t]==cha)){
// flag=1;
// goto END;
// }
//}
}
}
}
END:
if(flag==1){
cout<<dest<<endl;
}else{
cout<<"no solution"<<endl;
}
delete arr;
arr=NULL;
cin>>input;
}
return 0;