Chip Factory

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 sis_i
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\max_{i,j,k} { ( s_i + s_j ) ⊕ s_k } 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.
• 1 ≤ T ≤ 1000
• 3 ≤ n ≤ 1000
• 0 ≤ si ≤ 109
• 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個數,不用考慮相互之間是否有序。選出3個數後再選出2個數作爲sis_isjs_j,這樣就能枚舉所有情況。

AC code
#include<bits/stdc++.h>
using namespace	std;
typedef long long int LL;
const int N = 1010;

int main()
{
    ios::sync_with_stdio(0);

    int T;
    cin>>T;
    while(T--)
    {
        LL i,j,k,n;
        LL s[N],sum,ans=-1;
        cin>>n;
        for(i=0; i<n; i++)
            cin>>s[i];
        for(i=0; i<n; i++)
        {
            for(j=i+1; j<n; j++)
            {
                for(k=j+1;k<n;k++)
                {
                    ans = max(ans,(s[i]+s[j])^s[k]);
                    ans = max(ans,(s[i]+s[k])^s[j]);
                    ans = max(ans,(s[j]+s[k])^s[i]);
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
錯誤示範:
#include<bits/stdc++.h>
using namespace	std;
typedef long long int LL;
const int N = 1010;

int main()
{
    ios::sync_with_stdio(0);

    int T;
    cin>>T;
    while(T--)
    {
        LL i,j,k,n;
        LL s[N],sum,ans=-1;
        cin>>n;
        for(i=0; i<n; i++)
            cin>>s[i];
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
            {
                if( i == j)
                    continue;
                sum = s[i]+s[j];
                for(k=0; k<n; k++)
                {
                    if(k == i || k == j)
                        continue;
                    if(ans < sum^s[k])
                    {
                        ans = sum^s[k];
                    }
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

判斷了s[1],s[2],s[3],之後又判斷了s[2],s[1],s[3]。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章