您的位置:首页 > 其它

hdu 4334 Trouble 枚举。。。。

2013-08-07 17:46 274 查看
题意很容易,给你5个集合,问你有没有可能在每一个集合里面找1个数,然后把5个数加起来等于0

首先想到的是把4个n的集合合并成2个n^2的集合,然后 枚举其中一个n^2的集合和剩下的一个n的集合,在另一个n^2的集合里二分查找-sum是否存在,复杂度为 O(n^3)*log(n^2),

恭喜……超时。。。

赛后在网上看到另一种查找方式。。。。自己看吧。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<iostream>
#include<cstdlib>
using namespace std;

long long a[6][205];
long long sum1[40010];
long long sum2[40010];
int n,top1,top2;
int main()
{
    int cas;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d",&n);
        for(int i=1;i<=5;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%I64d",&a[i][j]);
            }
        }
        top2=1,top1=1;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                sum2[top2++]=a[4][i]+a[5][j];
                sum1[top1++]=a[1][i]+a[2][j];
            }
        }
        top2--;
        top1--;
        sort(sum1+1,sum1+1+top1);
        sort(sum2+1,sum2+1+top2);
        sort(a[3]+1,a[3]+n+1);
        int flag=0;
        for(int i=1;i<=n;i++)
        {
            int j=1,k=top2;
            while(j<=top1&&k>=1)	//关键……
            {
                if(sum1[j]+sum2[k]+a[3][i]==0)
                {
                    flag=1;
                    break;
                }
                else if(sum1[j]+sum2[k]+a[3][i]>0)
                k--;
                else j++;
            }
            if(flag) break;
        }
        printf("%s\n",flag?"Yes":"No");
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: