题目描述
一个图像有n个像素点,存储在一个长度为n的数组img里,每个像素点的取值范围[0,255]的正整数。
请你给图像每个像素点值加上一个整数k(可以是负数),得到新图newImg,使得新图newImg的所有像素平均值最接近中位值128。
请输出这个整数k。
输入描述
n个整数,中间用空格分开
eg.
129 130 129 130
备注
• 1 <= n <= 100
• 如有多个整数k都满足,输出小的那个k;
• 新图的像素值会自动截取到[0,255]范围。当新像素值<0,其值会更改为0;当新像素值>255,其值会更改为255;
例如newImg=”-1 -2 256″,会自动更改为”0 0 255″
输出描述
一个整数k
-2
import sys
input_str = sys.stdin.readline().strip()
img = list(map(int, input_str.split()))
len = len(img)
min_diff = sys.maxsize
#这行代码的作用是将变量 min_diff 初始化为一个非常大的值,通常在寻找最小值的算法中会这样做,目的是为了后续通过比较,用实际找到的较小值去更新它。
k_ans = 0
print(min_diff)
for k in range(-127, 129):#考虑到像素值取值范围为[0, 255],故k值取值范围在[-127, 129)之中
sum = 0
for i in range(len):
new_val = img[i] + k
new_val = max(0, min(new_val, 255))#新图的像素值会自动截取到[0,255]范围。当新像素值<0,其值会更改为0;当新像素值>255,其值会更改为255
sum += new_val
diff = abs(sum / len - 128)
if diff < min_diff:
min_diff = diff
k_ans = k
elif diff == min_diff and k_ans != 0:
k_ans = min(k_ans, k)
print(k_ans)
-
import sys
- 这行代码导入了 Python 的
sys
模块。sys
模块提供了一些与 Python 解释器和它的环境相关的函数和变量,在这里我们使用它来从标准输入读取数据。
- 这行代码导入了 Python 的
-
input_str = sys.stdin.readline().strip()
sys.stdin.readline()
从标准输入读取一行数据,返回的是一个字符串,这个字符串包含了用户输入的内容以及换行符(如果有的话)。strip()
方法用于移除字符串开头和结尾的空白字符(包括空格、制表符、换行符等)。所以input_str
最终是一个去除了首尾空白字符的字符串。
解题思路
代码思路
本题的解题思路是通过枚举每一个可能的 k值,计算新图像的每个像素点的值,并找出使得新图像的平均值与中位值 128 的差的绝对值最小的 k 值。
具体实现步骤如下:
-
枚举每一个可能的 k kk 值:
- 计算新图像的每个像素点的值。
- 将这些像素点的值累加起来,得到新图像的所有像素点值的和
sum
。
-
计算平均值和差的绝对值:
- 计算新图像的平均值
sum / len
。 - 计算新图像的平均值与中位值 128 之间的差的绝对值
diff
。
- 计算新图像的平均值
-
更新最优解:
- 如果
diff
小于min_diff
,更新min_diff
为当前的diff
,并更新k_ans
为当前的 k 值。 - 如果
diff
等于min_diff
且k_ans
不等于 0,则更新k_ans
为 k 和k_ans
中的较小值。
- 如果
注意事项
对于每一个像素点的新值,需要确保其在 [0, 255] 的范围内:
- 如果新值小于 0,则将其设为 0。
- 如果新值大于 255,则将其设为 255。
- 如果有多个整数 k 满足条件,输出较小的那个 k。