• hdu5269 Chip Factory


    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=5536

    题目:

    Chip Factory

    Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
    Total Submission(s): 2044    Accepted Submission(s): 919


    Problem Description
    John is a manager of a CPU chip factory, the factory produces lots of chips everyday. To manage large amounts of products, every processor has a serial number. More specifically, the factory produces n chips today, the i-th chip produced this day has a serial number si.

    At the end of the day, he packages all the chips produced this day, and send it to wholesalers. More specially, he writes a checksum number on the package, this checksum is defined as below:
    maxi,j,k(si+sj)sk

    which i,j,k are three different integers between 1 and n. And  is symbol of bitwise XOR.

    Can you help John calculate the checksum number of today?
     
    Input
    The first line of input contains an integer T indicating the total number of test cases.

    The first line of each test case is an integer n, indicating the number of chips produced today. The next line has n integers s1,s2,..,sn, separated with single space, indicating serial number of each chip.

    1T1000
    3n1000
    0si109
    There are at most 10 testcases with n>100
     
    Output
    For each test case, please output an integer indicating the checksum number in a line.
     
    Sample Input
    2
    3
    1 2 3
    3
    100 200 300
     
    Sample Output
    6
    400
     思路:这题居然可以N^3爆过去,我也是惊呆了==,数据太水了吧。正解是01trie。
    暴力代码:
    #include<stdio.h>
    int a[1001];
    int max(int ta,int b)
    {
        if(ta>b)
            return ta;
        return b;
    }
    int sc(int ta,int tb,int tc,int ans)
    {
        return max(ans,(ta+tb)^tc);
    }
    int main(void)
    {
        int t,n;
        scanf("%d",&t);
        while(t--)
        {
            int ans=0;
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]);
            for(int i=1;i<=n;i++)
                for(int j=i+1;j<=n;j++)
                for(int k=j+1;k<=n;k++)
                ans=sc(a[i],a[j],a[k],ans),ans=sc(a[j],a[k],a[i],ans),ans=sc(a[i],a[k],a[j],ans);
            printf("%d
    ",ans);
        }
        return 0;
    }

    01trie代码:

    #include <stdio.h>
    #include <string.h>
    struct Trie
    {
        int root, tot, next[100001][2], cnt[100001], end[100001];
    
        inline int Newnode()
        {
            memset(next[tot], -1, sizeof(next[tot]));
            cnt[tot] = 0;
            end[tot] = 0;
            return tot ++;
        }
    
        inline void Init()
        {
            tot = 0;
            root = Newnode();
        }
    
        inline void Insert(int x)
        {
            int p = root;
            cnt[p] ++;
            for(int i = 31; i >= 0; i --)
            {
                int idx = ((1 << i) & x) ? 1 : 0;
                if(next[p][idx] == -1)
                    next[p][idx] = Newnode();
                p = next[p][idx];
                cnt[p] ++;
            }
            end[p] = x;
        }
    
        inline void Del(int x)
        {
            int p = root;
            cnt[p] --;
            for(int i = 31; i >= 0; i --)
            {
                int idx = ((1 << i) & x) ? 1 : 0;
                p = next[p][idx];
                cnt[p] --;
            }
        }
    
        inline int Search(int x)
        {
            int p = root;
            for(int i = 31; i >= 0; i --)
            {
                int idx = ((1 << i) & x) ? 1 : 0;
                if(idx == 0)
                {
                    if(next[p][1] != -1 && cnt[next[p][1]])
                        p = next[p][1];
                    else
                        p = next[p][0];
                }
                else
                {
                    if(next[p][0] != -1 && cnt[next[p][0]])
                        p = next[p][0];
                    else
                        p = next[p][1];
                }
            }
            return x ^ end[p];
        }
    }tr;
    int max(int ta,int tb)
    {
        return ta>=tb?ta:tb;
    }
    int a[1001];
    int main(void)
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int n,ans=0;scanf("%d",&n);
            tr.Init();
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]),tr.Insert(a[i]);
            for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
            {
                tr.Del(a[i]),tr.Del(a[j]);
                ans=max(ans,tr.Search(a[i]+a[j]));
                tr.Insert(a[i]),tr.Insert(a[j]);
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    oracle如何在所有procedure里搜索某些关键字, 存储过程
    Delphi 中文件的操作FileOpen
    【oracle】varchar和varchar2区别
    Delphi 2010 新增功能之: IOUtils 单元(6): TPath(结构体) 的方法与属性
    oracle如何在所有procedure里搜索某些关键字, 存储过程
    Delphi ADOConnection连接 sqlserver
    一种在SQLServer中实现Sequence的高效方法
    SQL Server 序列(SEQUENCE)使用
    [惠普HP] HP1215出现硒鼓底灰刮板拆机图解教程
    记录一下 山客 BK650 UPS 的配置软件下载地址
  • 原文地址:https://www.cnblogs.com/weeping/p/5932731.html
Copyright © 2020-2023  润新知