公平划分

https://www.nowcoder.com/practice/ca13e8bc6bc44dd6a1b09b3ad31b885e?tpId=98&&tqId=33061&rp=1&ru=/activity/oj&qru=/ta/2019test/question-ranking

题目描述

小爱和小溪有N个数字,他们两个想公平的分配这些数字。小爱拿的数字集合为I=「i1, i2, ik」,小溪获得剩下的J,J=「j1, j2, jn-k」。但是他们衡量分配公平与否的原则与众不同:

在小爱拿到其中的K个数字的前提下,计算出他们分配偏差f(I)的最小值。

输入描述:

输入第一行两个数字,分别表示总的数字量N和小爱拿的数字量K。第二行有N个数字,表示每个数字的值。

输出描述:

输出一个数字,表示分配偏差f(I)的最小值。

示例1

输入

4 1
3 3 3 1

输出

2
#include
using namespace std;

// 根据每个state计算相应的偏差求最小,i为取到的数,j为不取的数
int f(int state,const vector& data){
    int ans=0;
    int n=data.size();
    for(int i=0;(1<& all, int n, int cur, int state, int k){
    if(k==0){
        all.push_back(state);
        return;
    }
    for(int i=cur;i<=n-k;i++){
        dfs(all,n,i+1,state^(1<>n>>k;
    vector data(n,0);
    for(int i=0;i>data[i];
    }
    
    int res=INT_MAX;
    vector all;  //存放所有可能存在的状态,每一种取与不取的状态用一个int数的位来表示(32位)
    
    dfs(all,n,0,0,k);
    for(int i=0;i

 

你可能感兴趣的:(牛客)