hdu 5536 Chip Factory (暴力)

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
  
2 3 1 2 3 3 100 200 300
 

Sample Output
  
6 400
 

Source

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

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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX_N 1000000
using 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。但不知道为什么会多这些时间...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值