F - Fairness Gym - 101061F

Dwik and his brother Samir both received scholarships from a famous university in India. Their father, Besher, wants to send some money with each of them.

Besher has n coins, the ith coin has a value of ai. He will distribute these coins between his two sons in n steps. In the ith step, he chooses whether to give the ith coin to Dwik or to Samir.

Let xi be the absolute difference between the sum of Dwik's and Samir's coins after the ith step. The unfairness factor of a distribution is max({x1, x2, ..., xn}). Besher wants to minimize the unfairness factor, can you help him?

Input

The first line of the input consists of a single integer t, the number of test cases. Each test case consists of 2 lines:

The first line contains an integer n (1 ≤ n ≤ 100).

The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 100).

Output

Print t lines, ith line containing a single integer, the answer to the ith test case.

Example

Input

2
5
1 2 1 4 3
7
4 5 6 1 1 3 4

Output

2
5

Note

In the first sample test, besher has 5 coins (1, 2, 1, 4, 3), he can distribute them in the following way:

Step 1: Give the first coin to dwik , d = 1, s = 0 x1 = |1 - 0| = 1

Step 2: Give the second coin to samir, d = 1, s = 2 x2 = |1 - 2| = 1

Step 3: Give the third coin to samir, d = 1, s = 3 x3 = |1 - 3| = 2

Step 4: Give the fourth coin to dwik, d = 5, s = 3 x4 = |5 - 3| = 2

Step 5: Give the fifth coin to samir, d = 5, s = 6 x5 = |5 - 6| = 1

max({x1, x2, x3, x4, x5}) = 2

题意:父亲给d和s两个儿子分硬币,要求每次分的硬币的差值最小,求在这个过程中差值的最大。

题解:暴力搜索法。把所有分法的最大值都求出来,维护其中的最小值。

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;

int a[105],Max,n;

void dfs(int pos,int d,int s,int cnt)
{
    int cont = abs(d - s);
    if(cnt >= Max)//剪枝
    {
        return;
    }
    if(pos > n)
    {
        Max = cnt;
        return;
    }
    else
    {
        if(cont > cnt) cnt = cont;
    }
    pos++;
    dfs(pos,d + a[pos],s,cnt);
    dfs(pos,d,s + a[pos],cnt);
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
        Max = 1e5;

        dfs(1,a[1],0,0);
        printf("%d\n",Max);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/eric_chen_song_lin/article/details/81139602