F. Fairness 分硬币最大差值最小

F. Fairness

time limit per test
2.0 s
memory limit per test
64 MB
input
standard input
output
standard output

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
Copy
2
5
1 2 1 4 3
7
4 5 6 1 1 3 4
output
Copy
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

 

题意:n个硬币分给a,b两个人,每分一个硬币对a,b当前硬币数量作差,分完之后,取分配过程中的最大差为最终权值。问在所有分配方法中,最终权值的最小值为多少

 

题解:数据量不大,暴力搜索每一种分配方法,求出每一种分配方法的最大差,取最小权值

 

#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<vector>
#include<stack>
#include<math.h>
#define mod 998244353
#define ll long long
#define MAX 0x3f3f3f3f
using namespace std;
int p[105];
int n,t,mx;
void dfs(int a,int b,int k,int now)
{
    if(k>=n)//目标状态,更新分硬币过程中的最大差值
    {
        mx=now;
        return;
    }
    if(now>=mx)//如果比上一种分硬币方法的最大差值还大,就返回,换一种分法
    {
        return;
    }
    else
    {
        if(abs(a-b)>now)//更新当前差
            now=abs(a-b);
        dfs(a+p[k],b,k+1,now);
        dfs(a,b+p[k],k+1,now);
    }

}
int main()
{
    cin>>t;
    while(t--)
    {
        mx=99999;
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>p[i];
        dfs(p[0],0,1,0);//第一个给谁差都一样
        cout<<mx<<endl;
    }
}

 

转载于:https://www.cnblogs.com/-citywall123/p/11227248.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值