Given S, a set of integers, find the largest d such that a + b + c = d where a, b, c, and d are distinct elements of S.
Input
Several S, each consisting of a line containing an integer 1 <= n <= 1000 indicating the number of elements in S, followed by the elements of S, one per line. Each element of S is a distinct integer between -536870912 and +536870911 inclusive. The last line of input contains 0.
Output
For each S, a single line containing d, or a single line containing "no solution".
Sample Input
5 2 3 5 7 12 5 2 16 64 256 1024 0Sample Output
12 no solution
题解:题目的大致意思就是说给你几个数,取出四个数,这四个数中三个数相加的和等于第四个数,求这第四个数.
二分思想
直接对输入的数据存储在数组中,并且进行sort排序,求出两数组相加的和,用结构体进行存储,对结构体进行数值上的排序,这个时候存储一下数值在数组中的下标,因为数值无法重复利用,然后双重for循环,一个从最大的开始,一个从最小的开始,二分查找,假如此时找的了,就返回,且此时的i与j不应该与存储的一样.
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int mp[2000],n,k,ans;
struct note
{
int l,r;
int num;
friend bool operator < (const note &a,const note &b)
{
return a.num<b.num;
}
} str[1009*1009];
int solve()
{
int sum;
ans=-0x3f3f3f3f;
for(int j=n-1; j>=0; j--)
{
for(int i=0; i<n; i++)
{
if(i==j)continue;
sum=mp[j]-mp[i];
note now;
now.num=sum;
now.l=i;
now.r=j;
note *tx=lower_bound(str,str+k,now);
if(tx->num==sum&&mp[j]>ans)
{
while(tx->num==sum)
{
if(tx->l!=i&&tx->r!=i&&tx->l!=j&&tx->r!=j)
{
ans=mp[j];
return 1;
}
tx++;
}
}
}
}
return 0;
}
int main()
{
while(~scanf("%d",&n)&&n)
{
for(int i=0; i<n; i++)
scanf("%d",&mp[i]);
k=0;
sort(mp,mp+n);
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(i==j)continue;
int num=mp[i]+mp[j];
str[k].l=i;
str[k].r=j;
str[k++].num=num;
}
}
sort(str,str+k);
if(solve())
printf("%d\n",ans);
else
printf("no solution\n");
}
return 0;
}