【牛客网】公平划分——解题思路

1.题目描述:

小爱和小溪有N个数字,他们两个想公平的分配这些数字。小爱拿的数字集合为I=「i1, i2, ik」,小溪获得剩下的J,J=「j1, j2, jn-k」。但是他们衡量分配公平与否的原则与众不同:在小爱拿到其中的K个数字的前提下,计算出他们分配偏差f(I)的最小值。

2.输入描述:

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

3.输出描述:

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

4.示例:

输入

复制

4 1
3 3 3 1

输出

复制

2

5.解题思路及代码:

在这个题目中,牛客网给出的是动态规划算法分类,其实可以简单些,首先我们通过组合数算法算出取出的情况,比如示例中的4个数字,小爱拿了一个,之后用暴力思想与另外三个分别计算绝对值,取最小,下面是详细的代码:

#include

#include

int sum,cou,lin;

int tag=99999999;

int b[999999];

int a[999999];

int book[999999]={0};

int comb(int n,int m)

{

    int i,j,k;

    if(m<=0)

    {

        sum=0;

        for(i=0;i

        {

            for(j=0;j

            {

                if(book[j]==0) sum=sum+abs(b[i]-a[j]);//printf("ok\n");

            }

        }

        if(tag>sum) tag=sum;

        return 0;

    }

    for(i=n;i>=m;i--)

    {

        b[m-1]=a[i-1];

        book[i-1]=1;

        comb(i-1,m-1);

        book[i-1]=0;

    }

}

int main()

{

    int i,j,n,m;

    while(scanf("%d%d",&n,&m)!=EOF)

    {

        cou=m;

        lin=n;

        for(i=0;i

        {

            scanf("%d",&a[i]);

        }

        comb(n,m);

        printf("%d\n",tag);

    }

}

  •  

 

【牛客网】公平划分——解题思路_第1张图片

你可能感兴趣的:(OJ)