//题意:给你一个公式a+b+c=d;让你在同一个集合内满足该条件时d的最大值,注意这个可以为负值。
//利用公式变形:b=d-c-a;它们的值个不相同,对b进行二分查找。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int num[1500];
int T;
int cmp(const void *a , const void *b)
{
return -(*(int*)a-*(int*)b);
}
int binary_serch(int s,int e,int pox)
{
if(s>e)
return 0;
int mid;
while(s<=e)
{
mid=(s+e)/2;
if(num[mid]==pox)
return 1;
if(num[mid]>pox)
{
s=mid+1;
}
else
{
e=mid-1;
}
}
return 0;
}
int main()
{
int flag;
int tem;
int i,j,k;
while(scanf("%d",&T),T)
{
flag=0;
memset(num,0,sizeof(num));
for( i=0; i<T; i++)
scanf("%d",&num[i]);
qsort(num,T,sizeof(num[0]),cmp);
for( i=0; i<T; i++)
{
for( j=0; j<T; j++)
{
if(num[i]==num[j])//避免出现负值的情况。
continue;
for( k=T-1; k>j; k--)
{
if(num[i]==num[k])//三个数不一样。
continue;
tem=num[i]-num[j]-num[k];
if(tem<num[j]&&tem>num[k])
{
if(binary_serch(j,k,tem))
{
flag=1;
break;
}
}
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
printf("%d\n",num[i]);
else
printf("no solution\n");
}
return 0;
}
poj2549 枚举+二分
最新推荐文章于 2023-09-23 08:53:49 发布