不理解实现任务的数学解决方案

时间:2016-02-22 13:33:09

标签: c++ algorithm

问题听起来像是:

  凯文有N个朋友和一个建筑物。他想组织一个   那个建筑物中的派对,他邀请了 1位朋友/ 。凯文   不幸的是,脾气暴躁的邻居对此并不满意   凯文的派对做的噪音。为此,凯文希望尽量减少   他的党的噪音水平。 (噪音水平等于数量   在建筑物中的朋友)为了做到这一点,有一天他可以   通过要求他的朋友离开来清除建筑物(他可以做K次,K天不久)。 ( ex :他清除了   在第2天之后建造,所以在第3天,当他邀请另一位朋友时   第3天噪音水平将是1,因为过去的一天他清除了   建造;如果他没有在第2天清除建筑物的噪音水平   对于第3天将是3(从第2天开始1,从第1天开始1和新邀请的朋友),第1,2和3天的总噪音水平将是1 + 2 + 3 = 6)。

为了更好地理解任务:

输入:

5 2 (N, K)

输出:

7

解释

在输入示例中,将按照以下顺序邀请N个朋友参加聚会:

1 (day 1)                                                       1 (day 1)
1 (day 2)    so in the building for each day will be present    2 (day 2)
1 (day 3)   ------------------------------------------------->  3 (day 3)
1 (day 4)          (without clearing the building)              4 (day 4)
1 (day 5)                                                       5 (day 5)
                                                             -----(+)
                                                               15

因此,清除建筑物0次( K = 0 ),噪音水平将为15。

清理建筑物1次( K = 1 ),总和将是:

(0 times)
    1                                              1
 __ 2 __     clearing the building after day 2     2
    3       ----------------------------------->   1
    4                                              2
    5                                              3
                                                 ----(+)
                                                   9

在这种情况下(K = 1),另一种解决办法可能是在第3天之后清除相同的金额。

清理2次( K = 2 ):

(0 times)
    1                                                  1
 __ 2 __     clearing the building after day 2 & 3     2
 __ 3 __    -------------------------------------->    1
    4                                                  1
    5                                                  2
                                                     ----(+)
                                                       7

我有解决方案,但我不明白!

我试过,拿了一些其他案例,但仍然没有,也许你们可以解释我为什么解决方案就是这样。

这是sum(N,K)的计算方法:

  

总和(N,K)=清除建筑物K次的最小噪音水平(K> = 0)

C ++代码:

int sum(int n)
 {
    return n * (n + 1) / 2;
 }

int solve(int n, int k)
{
    int p = k + 1;
    int mp = n/p;
    int bp = (n+p-1)/p;
    int nmaj = n%p;
    int nmic = p-nmaj;

    return nmic * sum(mp) + nmaj*sum(bp);
}

每个变量的目的是什么?

nmic * sum(mp)nmaj*sum(bp)计算什么?

!!!!

对于上面的示例(在开头--N = 5,K = 2),我调试了代码并为N=5, K=0..2写了每个变量的值,希望得到想法但没有成功。我将为你发布它们,也许你会得到这个想法然后向我解释(我是算法问题的新手)。

就是这样:

variable values for each case

我再说一遍,我试了几个小时才明白,但没有成功。这不是一个功课。谢谢!

1 个答案:

答案 0 :(得分:0)

代码如下:

int p = k+1;

p是"部分的数量"你划分天数(例如:Day1 + Day2 = part1,Day3 + Day4 = part2,Day5 = part3)

int mp = n/p;

mp是次要部分的天数,例如1(第5天)。它的计算方法是以天数为单位数的天数。

int bp = (n+p-1)/p;

bp是较大部分的天数,例如2(Day1 + Day2或Day3 + Day4)。我并没有真正得到确切的数学,但这是计算的内容

int nmaj = n%p;
int nmic = p-nmaj;

nmaj是主要部分的数量,在示例中为2(第1天+第2天和第3天+第4天),nmic是次要部分的数量(第5天为1)。

nmic * sum(mp) + nmaj*sum(bp);

这只返回次要部件的数量*次要部件的累计值+主要部件的数量*主要部件的累计值

sum函数只是初始元素= 1的特殊情况下算术级数的公式(或算术级数的总和)