Algorithm 计数“的数量;“坏的”;价值观
我在解决一个问题时遇到了这个问题 假设我们有一些粘土球。每个球都有一定的价值;每个球的值可以是任何正整数。最初,对于X和X+Y之间的每个值−1(含),我们有无限的球供应与此值 这些球有一个特殊的属性:它们中的任意两个可以混合以创建一个新球。如果原始球的值为a和b(可能为a=b),则新球的值为a+b。以这种方式创建的球也可用于混合其他球。我们可以自由地以任何方式混合球,我们可以选择任何次数 如果无法获得一个值为v的球,我们就称其为v(v>0)坏球;否则,值v是好的。我们想要制造出所有好值的球,我们想知道坏值的数量 注:球的好值有无限多个,但可以证明Y的坏值的数量总是有限的≥二, 对于给定的X和Y,设计一个程序来找出错误值的数量 例如 我们得到了Algorithm 计数“的数量;“坏的”;价值观,algorithm,Algorithm,我在解决一个问题时遇到了这个问题 假设我们有一些粘土球。每个球都有一定的价值;每个球的值可以是任何正整数。最初,对于X和X+Y之间的每个值−1(含),我们有无限的球供应与此值 这些球有一个特殊的属性:它们中的任意两个可以混合以创建一个新球。如果原始球的值为a和b(可能为a=b),则新球的值为a+b。以这种方式创建的球也可用于混合其他球。我们可以自由地以任何方式混合球,我们可以选择任何次数 如果无法获得一个值为v的球,我们就称其为v(v>0)坏球;否则,值v是好的。我们想要制造出所有好值的球,我们
[1,1+2-1]=[1,2]={1,2}
球。回答0;因为可以根据X和Y获得具有所有可能值的球
X = 3 ; Y = 3
我们得到了[3,3+3-1]=[3,5]={3,4,5}
球。
回答2;无法制作具有值1
和2
的As球
我认为小于X的值是无法生成的,但它似乎是错误的,也许我遗漏了什么。解决此类问题时,请从玩数字开始。假设我们得到了
2
球(Y=2
),让它们成为11
和12
(X=11
)。我们可以创造
- 从
ball:1
,11
12
- 从
球:2
,22
,23
24
- 从
球:3
,33
,34
,35
36
- 从
球:4
,44
,45
,46
,47
48
1..10
大小10
然后13..21
大小9
然后25..32
大小8
。你能看到图案吗?孔总数(坏数的数量)为
现在我们可以解决Y=2的问题了:它是自然级数的和
继续做Y=3
,例如,我们得到3
球(Y=3
)11,12,13
(X=11
)。我们可以创造:
- 从
球:1
,11
,12
13
- 从
球:2
,22
,23
,24
,25
26
- 从
球:3
,33
,34
,35
,36
,37
,38
39
- 从
球:4
,44
,45
,46
,47
,48
,49
,50
,51
52
1..10
然后14..21
然后26..33
然后是40..43
:
10 + 8 + 6 + 4 + 2 == 30
你能看到图案吗?你能解出Y=3吗?请注意区别:
X = 11; Y = 2 -> 10 + 9 + 8 + 7 + ... + 1
X = 11; Y = 3 -> 10 + 8 + 6 + 4 + 2
你现在能写出Y=3的公式吗?对于Y=4
,Y=5
X = 11; Y = 4 -> 10 + 7 + 4 + 1
x = 11; Y = 5 -> 10 + 6 + 2
对于任意Y
X = 11; Y -> 10 + (10 - 1 * (Y - 1)) + (10 - 2 * (Y - 1)) + ...
对于任意的X
和Y
(我们必须对所有正项求和)
代码:让它成为C:
private static int MySum(int X, int Y) {
int d = Y - 1; // difference
int n = (X - 1) / (Y - 1) + 1; // number of items to sum
int A1 = X - 1; // 1st item
int An = X - 1 - (n - 1) * d; // last item
return (A1 + An) * n / 2; // sum of arithmetic progression
}
一些测试(或演示):
(int, int)[] tests = new (int, int)[] {
(X : 11, Y : 2),
(X : 11, Y : 3),
(X : 11, Y : 4),
(X : 11, Y : 5),
(X : 1, Y : 2),
(X : 3, Y : 3),
};
string demo = string.Join(Environment.NewLine, tests
.Select(test => $"X = {test.Item1,2}, Y = {test.Item2} => {MySum(test.Item1, test.Item2),2}"));
Console.Write(demo);
X = 11, Y = 2 => 55
X = 11, Y = 3 => 30
X = 11, Y = 4 => 22
X = 11, Y = 5 => 18
X = 1, Y = 2 => 0 // test from the question
X = 3, Y = 3 => 2 // test from the question
结果:
(int, int)[] tests = new (int, int)[] {
(X : 11, Y : 2),
(X : 11, Y : 3),
(X : 11, Y : 4),
(X : 11, Y : 5),
(X : 1, Y : 2),
(X : 3, Y : 3),
};
string demo = string.Join(Environment.NewLine, tests
.Select(test => $"X = {test.Item1,2}, Y = {test.Item2} => {MySum(test.Item1, test.Item2),2}"));
Console.Write(demo);
X = 11, Y = 2 => 55
X = 11, Y = 3 => 30
X = 11, Y = 4 => 22
X = 11, Y = 5 => 18
X = 1, Y = 2 => 0 // test from the question
X = 3, Y = 3 => 2 // test from the question
想象一下,
X=11,Y=2
所以你得到了11
和12
的球:你不能创建13
,14
,…21
,25
等等。我不认为坏值的数量是有限的。如果你有两个偶数的球,比如说2和4,你如何得到奇数的球?@ChatterOne:那是不可能的:你得到了一个范围,例如,如果X=2,Y=3
这意味着你有[2,2+3-1]
-{2,3,4}
balls@DmitryBychenko哦,我误解了你只是有两个值而不是一个范围。好吧,那么。@DmitryBychenko现在我明白了,但是我们怎么能计算这些值呢?这太优雅了!非常感谢你的解释。你能检查一下吗?我在答案中尝试了实现,但在某些情况下失败了。@Steve:gcd的最大化和似乎是一个完全不同的问题;这里我们有一个求和的自然级数(a1=X-1
,difference=Y-1
等等)。我同意这是一个完全不同的问题,只是想对它有一些了解。还有一个疑问,我们如何找到N,即使用a.P公式求和的项数?Sn=[n*(2*a+(n-1)*d)]/2
(int, int)[] tests = new (int, int)[] {
(X : 11, Y : 2),
(X : 11, Y : 3),
(X : 11, Y : 4),
(X : 11, Y : 5),
(X : 1, Y : 2),
(X : 3, Y : 3),
};
string demo = string.Join(Environment.NewLine, tests
.Select(test => $"X = {test.Item1,2}, Y = {test.Item2} => {MySum(test.Item1, test.Item2),2}"));
Console.Write(demo);
X = 11, Y = 2 => 55
X = 11, Y = 3 => 30
X = 11, Y = 4 => 22
X = 11, Y = 5 => 18
X = 1, Y = 2 => 0 // test from the question
X = 3, Y = 3 => 2 // test from the question