首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

uva 10125 - Sumsets美题

2012-08-30 
uva 10125 - Sumsets好题#includecstdlib#includeiostream#includecstdio#includecmath#includes

uva 10125 - Sumsets好题

#include<cstdlib>#include<iostream>#include<cstdio>#include<cmath>#include<set>#include<cstring>#include <algorithm>#define M 5368#define N 1000010#define inf 0x7f7f7f7fusing namespace std;int head[N],next[N];int a[1000],sum[N],st[N][2];int hash(int u){//    u=((u<<1)+(u>>1))/2;//    return (u & 0x7fffffff)%N;    if(a<0)        a=-a;    return a%N;}void insert(int k){    int h=hash(sum[k]);    next[k]=head[h];    head[h]=k;}int find(int x,int y,int s){    int h=hash(s);    h=head[h];//容易忘掉!!wa    while(h!=-1)    {        if(s==sum[h]&&st[h][0]!=x&&st[h][0]!=y&&st[h][1]!=x&&st[h][1]!=y)            return 1;        h=next[h];    }    return 0;}int main(){#ifndef ONLINE_JUDGE    freopen("ex.in","r",stdin);#endif    int n;    while(scanf("%d",&n))    {        memset(head,-1,sizeof(head));        if(!n)            break;        for(int i=0; i<n; i++)            scanf("%d",&a[i]);        sort(a,a+n);        int k=0;        for(int i=0; i<n; i++)            for(int j=i+1; j<n; j++)//降为o(n^2)            {                sum[k]=a[i]+a[j];                insert(k);                st[k][0]=i;                st[k++][1]=j;            }        int flag=1;        for(int i=n-1; i>=0; i--)        {            for(int j=0; j<n; j++)                if(i==j)                    continue;                else if(find(i,j,a[i]-a[j]))                {                    flag=0;                    printf("%d\n",a[i]);                    break;                }            if(!flag)                break;        }        if(flag)            printf("no solution\n");    }    return 0;}

热点排行