题目描述:
一个图像有n个像素点,存储在一个长度为n的数组img里,每个像素点的取值范围[0,255]的正整数。 请你给图像每个像素点值加上一个整数k(可以是负数),得到新图newImg,使得新图newImg的所有像素平均值最接近中位值128。 请输出这个整数k。
输入描述:
n个整数,中间用空格分开
例如:
0 0 0 0
4个数值,中间用空格分开
输出描述:
一个整数k
补充说明:
• 1 <= n <= 100 • 如有多个整数k都满足,输出小的那个k;
• 新图的像素值会自动截取到[0,255]范围。当新像素值<0,其值会更改为0;当新像素值>255,其值会更改为255;
例如newImg="-1 -2 256",会自动更改为"0 0 255"
示例1
输入:
0 0 0 0
输出:
128
说明:
四个像素值都为0
示例2
输入:
129 130 129 130
输出:
-2
说明:
-1的均值128.5,-2的均值为127.5,输出较小的数-2
解题思路:
复杂度有点高。用一个列表来存储曝光后的像素数据,再用一个列表lst来存储符合要求的k值。如果曝光后的平均值小于此前的最小值,则把lst清空,存入k
def f(lst:list):
sum=0
l=len(lst)
for i in lst:
sum+=i
return sum/l
img=list(map(int,input().split()))
min=128
lst=[]
for k in range(-255,256):
newimg=[xs+k if 0<=(xs+k)<=255 else 0 if (xs+k)<0 else 255 for xs in img]
newimg_count=f(newimg)
if abs(128-newimg_count)<min:
lst.clear()
lst.append(k)
min=abs(128-newimg_count)
print(sorted(lst)[0])