poj2549 3sum/二分查找

来源:互联网 发布:引导页源码 编辑:程序博客网 时间:2024/06/08 00:35

由此题目了解到有一个3sum算法,自己又将a+b存起来用二分查找AC了,不过3sum的时间复杂度高些但耗时反倒少些。。。。

 

ACcode:

/**3sum O(n^3)*/#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 1005;bool flag;int n, d, num, s[MAXN];int main(){    while (~scanf("%d",&n),n)    {        num=1,flag=true;        for (int i=0;i<n;i++) scanf("%d",s+i);        sort(s,s+n);        for (int i=1;i<n;i++)            if (s[i]!=s[i-1]) s[num++]=s[i];        n=num;        for (d=n-1;d>=0&&flag;--d)        {            for (int i=0;i<n-3&&flag;i++)            {                int j=i+1,k=n-1;                while (j<k)                {                    long long t=s[i]+s[j]+s[k];                    if (t==s[d])                    {                        if (i==d||j==d||k==d) break;                        flag=false;                        n=t;                        break;                    }                    else if (t>s[d]) k--;                    else j++;                }            }        }        if (flag) printf("no solution\n");        else printf("%d\n",n);    }    return 0;}

 

/**二分查找O(n^2*log(n))*/#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int nsize=1111;struct ad{    int a,b,s;    ad(){};    ad(int x,int y,int z)    {        a=x,b=y,s=z;    }}t[nsize*1000];int n,k,d,c[nsize],top;bool cmp(ad a1,ad a2){    if (a1.s==a2.s) return a1.a<a2.a;    return a1.s<a2.s;}int Fin(int x,int y){    int low=0,high=top-1;    while (low<=high)    {        int mid=(low+high)>>1;        if (t[mid].s==x)        {            if (y==t[mid].a||y==t[mid].b)            {                if (mid>0&&t[mid-1].s==x) return 1;                if (mid<top-1&&t[mid+1].s==x) return 1;                return 0;            }            else return 1;        }        else if (t[mid].s>x) high=mid-1;        else low=mid+1;    }    return 0;}int main(){    while (~scanf("%d",&n),n)    {        for (int i=0;i<n;i++) scanf("%d",&c[i]);        sort(c,c+n);        k=1,top=0;        for (int i=1;i<n;i++)            if (c[i]!=c[i-1]) c[k++]=c[i];        n=k;        for (int i=0;i<n;i++)        {            for (int j=i+1;j<n;j++)            {                t[top++]=ad(c[i],c[j],c[i]+c[j]);            }        }        sort(t,t+top,cmp);        bool flag=true;        for (int i=n-1;i>=0&&flag;i--)        {            for (int j=i-1;j>=0&&flag;j--)            {                 d=c[i],k=c[j];                 if (Fin(d-k,k)&&Fin(d-k,d))                 {                     flag=false;                     printf("%d\n",d);                 }            }        }        if (flag) printf("no solution\n");    }    return 0;}