Codeforces Round #618 (Div. 2)

A.
Guy-Manuel and Thomas have an array aa of nn integers [a1,a2,…,ana1,a2,…,an]. In one step they can add 11 to any element of the array. Formally, in one step they can choose any integer index ii (1≤i≤n1≤i≤n) and do ai:=ai+1ai:=ai+1.

If either the sum or the product of all elements in the array is equal to zero, Guy-Manuel and Thomas do not mind to do this operation one more time.

What is the minimum number of steps they need to do to make both the sum and the product of all elements in the array different from zero? Formally, find the minimum number of steps to make a1+a2+a1+a2+ …… +an≠0+an≠0 and a1⋅a2⋅a1⋅a2⋅ …… ⋅an≠0⋅an≠0.

Input
Each test contains multiple test cases.

The first line contains the number of test cases tt (1≤t≤1031≤t≤103). The description of the test cases follows.

The first line of each test case contains an integer nn (1≤n≤1001≤n≤100) — the size of the array.

The second line of each test case contains nn integers a1,a2,…,ana1,a2,…,an (−100≤ai≤100−100≤ai≤100) — elements of the array .

Output
For each test case, output the minimum number of steps required to make both sum and product of all elements in the array different from zero.
Example
inputCopy
4
3
2 -1 -1
4
-1 0 0 1
2
-1 2
3
0 -2 1
outputCopy
1
2
0
2
Note
In the first test case, the sum is 00. If we add 11 to the first element, the array will be [3,−1,−1][3,−1,−1], the sum will be equal to 11 and the product will be equal to 33.

In the second test case, both product and sum are 00. If we add 11 to the second and the third element, the array will be [−1,1,1,1][−1,1,1,1], the sum will be equal to 22 and the product will be equal to −1−1. It can be shown that fewer steps can’t be enough.

In the third test case, both sum and product are non-zero, we don’t need to do anything.

In the fourth test case, after adding 11 twice to the first element the array will be [2,−2,1][2,−2,1], the sum will be 11 and the product will be −4−4.

题意:最少可以使用几次+1操作使得数组值相加和相乘均不为0
思路:遇到0时答案加一 因为相乘不能为0 同时计算总和 如果总和为0则再加一

#include 

using namespace std;

typedef long long LL ;

int a[105];

int main()
{
    int t;

    while(cin >> t)
    {
        while(t --)
        {
            int n;

            cin >> n;

            int sum = 0;
            int res = 0;

            for(int i = 0;i < n;i ++)
            {
                cin >> a[i];
                sum += a[i];

                if(a[i] == 0)
                    res++,sum += 1;
            }

            if(sum == 0)
                res++;

            cout << res << '\n';
        }
    }

    return 0;
}

B.
题意:输入2*n个数 将其分成两组并且两组数目均为奇数 两组中位数 最小的差值
思路:看样例 找规律 排序后中间的数互减即可

#include 

using namespace std;

typedef long long LL ;
const int N = 2e5+5;

int a[N];

int main()
{
    int t;

    while(cin >> t)
    {
        while(t --)
        {
            int n;

            cin >> n;

            for(int i = 1;i <= n+n;i ++)
                cin >> a[i];

            sort(a+1,a+1+2*n);

            cout << a[n+1] - a[n] << '\n';
        }
    }

    return 0;
}

C.C. Anu Has a Function
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
Anu has created her own function ff: f(x,y)=(x|y)−yf(x,y)=(x|y)−y where || denotes the bitwise OR operation. For example, f(11,6)=(11|6)−6=15−6=9f(11,6)=(11|6)−6=15−6=9. It can be proved that for any nonnegative numbers xx and yy value of f(x,y)f(x,y) is also nonnegative.

She would like to research more about this function and has created multiple problems for herself. But she isn’t able to solve all of them and needs your help. Here is one of these problems.

A value of an array [a1,a2,…,an][a1,a2,…,an] is defined as f(f(…f(f(a1,a2),a3),…an−1),an)f(f(…f(f(a1,a2),a3),…an−1),an) (see notes). You are given an array with not necessarily distinct elements. How should you reorder its elements so that the value of the array is maximal possible?

Input
The first line contains a single integer nn (1≤n≤1051≤n≤105).

The second line contains nn integers a1,a2,…,ana1,a2,…,an (0≤ai≤1090≤ai≤109). Elements of the array are not guaranteed to be different.

Output
Output nn integers, the reordering of the array with maximum value. If there are multiple answers, print any.

Examples
inputCopy
4
4 0 11 6
outputCopy
11 6 4 0
inputCopy
1
13
outputCopy
13
Note
In the first testcase, value of the array [11,6,4,0][11,6,4,0] is f(f(f(11,6),4),0)=f(f(9,4),0)=f(9,0)=9f(f(f(11,6),4),0)=f(f(9,4),0)=f(9,0)=9.

[11,4,0,6][11,4,0,6] is also a valid answer.

题意:任意排序 使得题给的公式值最大

思路:题给的公式为或运算 显然当一个数的某一位为1且其他数的那一位为0时 他才会对答案有贡献
预处理每个数32为的情况 然后遍历即可 对答案有贡献的塞进数组里 其他的数排序任意

#include 

using namespace std;

typedef long long LL ;

const int N = 1e5+5;

LL a[N];
LL bit[N][35];
int vis[N];

vector <int> res;

int main()
{
    int t;

    int n ;

    cin >> n;

    for(int i = 0;i < n;i ++)
    {
        cin >> a[i];

        for(int j = 32; j >= 0;j --)///预处理该数二进制中每一位的情况
        {
            bit[i][j] = (a[i]>>j)&1;
        }
    }

    for(int k = 32; k >= 0;k --)///遍历二进制中的每一位
    {
        int sum = 0;///计算该位上为1的数 的数量
        int pos = 0;///记录位置

        for(int i = 0;i < n;i ++)
        {
            if(bit[i][k]&1)
            {
                sum ++;
                pos = i;
            }
        }

        if(sum == 1 && !vis[pos])///如果只有这个数该位上为1 并且未访问过 则扔进数组
        {
            res.push_back(a[pos]);
            vis[pos] = 1;
        }
    }

    for(int i = 0;i < res.size();i ++)
        cout << res[i] << ' ';

    for(int i = 0;i < n;i ++)
    {
        if(!vis[i])
            cout << a[i] << ' ';
    }

    cout << '\n';

    return 0;
}

你可能感兴趣的:(比赛)