Gym 101061F Fairness【dfs+剪枝】

探讨如何在分配一组数值的过程中,通过合理的策略最小化两方持有数值之差的最大绝对值,使用深度优先搜索算法并结合剪枝优化求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


传送门:Gym 101061F


Fairness
time limit per test2.0 s memory limit per test64 MB inputstandard input outputstandard output

Problem Description
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.

Sample Input
2
5
1 2 1 4 3
7
4 5 6 1 1 3 4

Sample 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




题意:

给定n个权值,按序做n次选择,
每次选择把该权值分配给A或B,
其最终的权值既是在决策过程中A和B差值绝对值的最大值,
我们的目标是使这个函数最小化.输出最小权值.

题解:

当时做的时候想用dp做,但是状态怎么转移我一直想不出来,就看到他的n的范围也不是很大,就想有dfs做。
直接做交上去后超时了。然后就想到了剪枝,每次只要该行的差大于当前最大值了,就直接退出。




AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=110000;
int t;
int n;
int a[110];
int maxn;
void dfs(int x,int m,int s,int d)
{
  if(m>=maxn)
    return ;
  if(x>=n)
  {
    maxn=m;
    return;
  }
  if(abs(s-d)>m) m=abs(s-d);
  dfs(x+1,m,s+a[x],d);
  dfs(x+1,m,s,d+a[x]);
}
int main()
{
  scanf("%d",&t);
  while(t--)
  {
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
      scanf("%d",&a[i]);
    }
    maxn=inf;
    dfs(1,0,a[0],0);
    printf("%d\n",maxn);
  }
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值