问题听起来像是:
凯文有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
写了每个变量的值,希望得到想法但没有成功。我将为你发布它们,也许你会得到这个想法然后向我解释(我是算法问题的新手)。
就是这样:
我再说一遍,我试了几个小时才明白,但没有成功。这不是一个功课。谢谢!
答案 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的特殊情况下算术级数的公式(或算术级数的总和)