Sumsets
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions:11935 | Accepted: 3297 |
Description
![](https://i-blog.csdnimg.cn/blog_migrate/d903c9a08afdf3b6dfac35b18da4660b.jpeg)
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 0
Sample Output
12 no solution
将a+b,c-d看成两个序列,然后二分查找。
注意不要忘记去重
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1000+5;
ll t[maxn],d[maxn*maxn];
struct node
{
ll sum;
int use1,use2;
} c[maxn*maxn];
bool cmp(const node& a,const node& b)
{
return a.sum<b.sum;
}
int main()
{
int n;
while(~scanf("%d",&n),n)
{
int i,j,s=0;
for(i=0; i<n; i++)
scanf("%lld",&t[i]);
sort(t,t+n);
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if(i!=j)
{
c[s].sum=t[i]+t[j];
c[s].use1=i;
c[s++].use2=j;
}
sort(c,c+s,cmp);
for(i=0; i<s; i++)
d[i]=c[i].sum;
ll ma=-1e17;
for(i=0; i<n; i++)
{
for(j=n-1; j>=0; j--)
{
if(i!=j&&t[j]>ma)
{
ll u=-(t[i]-t[j]);
int id1=lower_bound(d,d+s,u)-d;
int id2=upper_bound(d,d+s,u)-d-1;
for(int k=id1;k<id2;k++)
{
int a=c[k].use1,b=c[k].use2;
if(a!=i&&a!=j&&b!=i&&b!=j)
{
ma=t[j];break;
}
}
}
}
}
if(ma!=-1e17)printf("%lld\n",ma);
else printf("no solution\n");
}
return 0;
}