我试图在这里用C#:https://open.kattis.com/submissions/8340306解决这个问题(编辑:下面的完整问题)
所以,简而言之:给予是一堆砖块。目的是想弄清楚,我能用这些区块建造一个三维金字塔有多高。顶层有1块砖,第2层从前9块砖,第3层25块等等。
我想我解决了这个问题,用这个例子来说是正确的。在我所做的所有计算中也是正确的。然而:从5个样本-运行,其中只有例外,在3。
编辑--完整的问题是:当启动一个更大的项目时,比如建造金字塔,最好三思而后行。你今天的任务是编写一个程序,计算给定一定数量的石块可以建多高的金字塔。
我们假定要建造的金字塔是紧凑的,即里面没有空腔。此外,我们假设它是根据图1中的原理构建的,每一层都是方形的,其边长比下面的一层短两倍。顶层总是由单个块组成。。
如果你有剩余的区块,只要你建立一个完整的金字塔,这是好的。
输入第一行输入包含整数N (1≤N≤100000000),即可用的块数。
输出输出一个整数--可以用至少N个块构建的金字塔的最大高度。
我解决方案的结果是:
这是我的代码--请轻点,我只是在学习:)
public static void Main()
{
int bloecke = int.Parse(Console.ReadLine());
int neueBloecke = 1; // Bloecke, die für die neue Ebene benötigt werden
int sumBloecke = 1; // Blöcke in Summe
int seitenLaenge = 1; // Seitenlänge der Ebene
int ebene = 1; // Auf welcher Ebene wir uns aktuell befinden
while (sumBloecke < bloecke)
{
// Wenn wir weniger als 10 Blöcke haben, brauchen wir gar nicht anzufangen > wir haben 1 Ebene
if (bloecke < 10)
{
ebene = 1;
break;
}
// Andernfalls legen wir los
seitenLaenge += 2;
neueBloecke = seitenLaenge * seitenLaenge;
sumBloecke += neueBloecke;
if (sumBloecke>=bloecke)
{
break;
} else
{
ebene++;
}
}
Console.Write(ebene);
}
发布于 2022-01-27 13:48:09
看上去你只是想让它发挥作用。您已经用没有真正目的的代码将它复杂化了,现在它令人困惑。
您的循环有两个退出条件,而只有一个条件是必需的,您的ebene = 1
在那里没有任何原因,等等。
你走错路了。如果您只处理代码,直到它适用于您正在应用的任何测试,那么您将永远无法确信它适用于您没有测试的东西。
你需要向自己证明这是正确的。试着做这样的事情:
ebene+1
是有效的。(如果金字塔所需的块总数大于invariant)ebene
,并计算下一个大小的变量和循环.,则称为循环ebene
)。
如果您实现了这个简单的过程,那么您将确信结果是正确的。
发布于 2022-01-28 11:09:22
这对我来说很管用:
public static void Main()
{
int availableBlocks = int.Parse(Console.ReadLine());
int newBlocks = 0; // blocks for the new level
int sumBlocks = 0; // sum of used blocks
int edgeLength = 0; // blocks on one side of the level
int level = 0; // which level are we
while (true)
{
// e.g. availableBlocks = 15
//
// edge | new | sum | ok? | level
// 0 0 0 yes 0
// 1 1 1 yes 1
// 3 9 10 yes 2
// 4 16 26 no -
// edgeLength increases by 2, except for the first top-level
if (edgeLength==0)
{
edgeLength++;
} else
{
edgeLength += 2;
}
newBlocks = edgeLength * edgeLength;
sumBlocks += newBlocks;
// Check, if we still have enought blocks
if (sumBlocks <= availableBlocks)
{
level++;
} else
{
Console.WriteLine(level);
break;
}
}
}```
https://stackoverflow.com/questions/70876569
复制相似问题