POJ 2785

一开始用dfs做,老是过不了样例,原来数组是a[N][4],mark[N][4]被我写成了a[4][N],mark[4][N].哎

不过最后改过来交了还是超时了,妈的 dfs 超时,二分那种蠢逼做法不超时,无语。

dfs

 1 #include<queue>
 2 #include<math.h>
 3 #include<stdio.h>
 4 #include<string.h>
 5 #include<iostream>
 6 #include<algorithm>
 7 using namespace std;
 8 #define N 115
 9 
10 int a[N][4];
11 int mark[N][4];
12 int n,cnt,sum;
13 
14 void dfs(int x,int s)
15 {
16     if(x==4)
17     {
18         if(s==0)
19         {
20             cnt++;
21             return;
22         }
23         else
24         {
25             return;
26         }
27     }
28 for(int i=0;i<n;i++)
29     {
30         int ss=s;
31         if(!mark[i][x])
32         {
33             ss+=a[i][x];
34             mark[i][x]=1;
35             dfs(x+1,ss);
36             mark[i][x]=0;
37         }
38     }
39 }
40 
41 int main()
42 {
43     while(~scanf("%d",&n))
44     {
45         memset(mark,0,sizeof(mark));
46         cnt=sum=0;
47         for(int i=0;i<n;i++)
48             scanf("%d%d%d%d",&a[i][0],&a[i][1],&a[i][2],&a[i][3]);
49 
50         dfs(0,0);
51         printf("%d\n",cnt);
52     }
53     return 0;
54 }

 

时间要求是15000MS,没注意,用二分暴力做,把前两组数的亮亮组合都搞出来,后两组也搞出来加一个符号,然后看有多少相等的,就是答案

#include<queue>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 4123

int a[N][4];
int num1[N*N],num2[N*N];
int n,cnt,sum;

int erfen(int x)
{
    int num,mid,l=0,r=n*n-1;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(num2[mid]==x)
        {
            num=1;
            for(int i=mid-1;num2[i]==x&&i>=0;i--) num++;
            for(int i=mid+1;num2[i]==x&&i<n*n;i++) num++;
            return num;
        }
        else if(num2[mid]<x)
        {
            l=mid+1;
        }
        else
        {
            r=mid-1;
        }
    }
    return 0;
}

int main()
{
    while(~scanf("%d",&n))
    {
        cnt=0;
        for(int i=0;i<n;i++)
            scanf("%d%d%d%d",&a[i][0],&a[i][1],&a[i][2],&a[i][3]);

        int k=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
        {
            num1[k]=a[i][0]+a[j][1];
            num2[k++]= -(a[i][2]+a[j][3]);
        }
        sort(num2,num2+k);
        for(int i=0;i<k;i++)
        {
            cnt+=erfen(num1[i]);
        }
        printf("%d\n",cnt);

    }
    return 0;
}

开始没注意是a[N][4]不是a[4][N]导致wa了几发,但是这不应该是数组越界吗,却给我wa,不明白

 

hash的做法以后再学

posted @ 2015-08-16 13:39  wmxl  阅读(214)  评论(0编辑  收藏  举报