programmer330 @ 2024-11-28 20:47:09
司马迁的史记
题目描述:
众所周知,司马迁是在牢房里编写出的史记。可是,现在有强迫症的司马迁遇到了一个艰巨的问题:就是竹板长度不一!
司马迁是要把字刻在竹板上的,于是这竹板长度不一让他很烦躁。不过司马迁可以用气功将任意一个竹板截任意长度单位,并把这一段接到相邻(左或右)的竹板上。注意一下,竹板围成一个圈,所以,有n个竹板,那么第一个竹板两边分别是第二个竹板和第n个竹板,第n个竹板两边分别是第一个竹板和第n-1个竹板。
现在司马迁想知道,最少要把多长的竹板换给其他竹板,n个竹板的长度才会一样?
输入格式:
第一行一个数n,表示有n个竹板围成一圈。
第二行n个数,第i个数ai表示第i个竹板的长度,数据保证所有竹板长度只和能被n整除。
输出格式:
一个数ans,表示至少要把多少的长度单位给别的竹板,所有竹板长度才会一样。
样例输入
4
1 2 5 4
样例输出
4
这题在洛谷上有类似的题吗?
没有的话给个解法,谢谢
by wang231064_YM @ 2024-11-28 20:59:27
思路如下: 首先读取竹板的数量n和每个竹板的长度,计算所有竹板长度的总和total_length以及平均长度average_length。 因为总和不变,所以可以计算左右两侧差值来确定需要转移的长度,从而找到最小的转移长度使得所有竹板长度相同。 然后通过循环计算从左到右的累积差值leftDiff,并根据总和计算右侧的差值rightDiff。计算将当前竹板左侧调整到平均长度所需的转移长度transfer,并更新最小转移长度minTransfer。 最后输出最小转移长度。 在计算过程中,利用了竹板长度总和不变的性质,通过计算左右两侧的差值来确定需要转移的长度,从而找到最小的转移长度使得所有竹板长度相同。
建议调用<numeric>库,以便于数值计算
个人见解仅供参考