• 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
    ",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
    ",cnt);
    
        }
        return 0;
    }
    

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

    hash的做法以后再学

  • 相关阅读:
    Linux的kobject机制
    利用内核模块添加系统调用
    register_sysctl_table实现内核数据交互
    设计模式17---享元模式
    设计模式16---中介者模式
    java实现PV操作
    设计模式15---桥接模式
    设计模式15---迭代器模式
    设计模式14---组合模式
    设计模式13---备忘录模式
  • 原文地址:https://www.cnblogs.com/wmxl/p/4734245.html
Copyright © 2020-2023  润新知