hdu 5536 Chip Factory (暴力)

来源:互联网 发布:51网络论坛 编辑:程序博客网 时间:2024/06/06 18:25

Chip Factory

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


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
231 2 33100 200 300
 

Sample Output
6400
 

Source
2015ACM/ICPC亚洲区长春站-重现赛(感谢东北师大)

这题正解是字典树。当时看到这题首先就是想到暴力了= =

思路:O(n^3)无疑是会TLE的,不过可以预处理一下降低到O(n*m),先将(si+sj)这个值算出来存起来,然后再来算xor的值。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define MAX_N 1000000using namespace std;struct data{    int i,j,sum;}q[MAX_N];int a[1005];int main(){    int t,n,cnt;    scanf("%d",&t);    while(t--)    {        cnt=0;        scanf("%d",&n);        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);        for(int i=1;i<=n-1;i++)        {            for(int j=i+1;j<=n;j++)            {                q[cnt].i=i,q[cnt].j=j,q[cnt].sum=a[i]+a[j];                cnt++;            }        }        int maxn=0;        /*for(int i=1;i<=n;i++)        {            for(int j=0;j<cnt;j++)            {                if(i!=q[j].i&&i!=q[j].j)                    maxn=max(maxn,q[j].sum^a[i]);            }        }*/        for(int i=0;i<cnt;i++)        {            for(int j=1;j<=n;j++)            {                if(j!=q[i].i&&j!=q[i].j)                    maxn=max(maxn,q[i].sum^a[j]);            }        }        printf("%d\n",maxn);    }    return 0;}


PS:暴力的代码可以勉强A,而注释掉的循环会比AC代码多500-700ms(亲测),甚至有时不能A。但不知道为什么会多这些时间...
原创粉丝点击