题目描述
一个图像有n个像素点,存储在一个长度为n的数组img里,每个像素点的取值范围[0,255]的正整数。
请你给图像每个像素点值加上一个整数k(可以是负数),得到新图newImg,使得新图newImg的所有像素平均值最接近中位值128。
请输出这个整数k。
输入描述
n个整数,中间用空格分开
输出描述
一个整数k
备注
• 1 <= n <= 100
• 如有多个整数k都满足,输出小的那个k;
• 新图的像素值会自动截取到[0,255]范围。当新像素值<0,其值会更改为0;当新像素值>255,其值会更改为255;
例如newImg=”-1 -2 256″,会自动更改为”0 0 255″
用例
输入 | 0 0 0 0 |
输出 | 128 |
说明 | 四个像素值都为0 |
输入 | 129 130 129 130 |
输出 | -2 |
说明 | -1的均值128.5,-2的均值为127.5,输出较小的数-2 |
题目解析
问题描述
给定一个包含n个像素点的数组img
,每个像素点的取值范围为[0, 255]的整数。需要找到一个整数k
,使得将每个像素点的值加上k
后,新图像newImg
的所有像素点的平均值最接近128。
输入描述
- 输入包含n个整数,中间用空格分开。
输出描述
- 输出一个整数
k
。
备注
- 1 <= n <= 100
- 新图像像素值会自动截取到[0, 255]范围,当新像素值<0时,会更改为0;当新像素值>255时,会更改为255。
- 如果有多个整数k都满足,输出最小的那个k。
示例
输入:
0 0 0 0
输出:
128
解释:四个像素值均为0,增加128使得新像素值为128,平均值为128。
输入:
129 130 129 130
输出:
-2
解释:-1的均值为128.5,-2的均值为127.5,输出较小的数-2。
解题思路
- 计算初始平均值:首先计算输入像素点的初始平均值。
- 寻找合适的k:为了使新图像的平均值最接近128,我们需要计算每个像素加上k后的值,并限制在[0, 255]范围内。
- 计算最佳k:通过遍历可能的k值,找到使新平均值最接近128的k,并在有多个k满足条件时选择最小的k。
C++代码实现
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <cmath>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> img(n);
for (int i = 0; i < n; ++i) {
cin >> img[i];
}
double target = 128.0;
int best_k = INT_MIN;
double closest_avg = DBL_MAX;
for (int k = -255; k <= 255; ++k) {
double sum = 0;
for (int i = 0; i < n; ++i) {
int new_value = img[i] + k;
new_value = max(0, min(255, new_value));
sum += new_value;
}
double new_avg = sum / n;
if (abs(new_avg - target) < closest_avg || (abs(new_avg - target) == closest_avg && k < best_k)) {
closest_avg = abs(new_avg - target);
best_k = k;
}
}
cout << best_k << endl;
return 0;
}
代码说明
- 读取输入:读取像素点个数n和n个像素值。
- 初始化目标和最优参数:目标平均值为128,初始化最优k为最小整数,最接近平均值的差异为最大浮点数。
- 遍历可能的k值:从-255到255,计算每个像素点加上k后的新值,并限制在[0, 255]范围内,计算新平均值。
- 更新最优k值:比较新平均值与目标平均值的差异,更新最优k值。
- 输出结果:输出最优k值。
这个程序能够找到最优的k值,使得新图像的平均像素值最接近128,并输出结果。
def find_best_k(img):
n = len(img)
target = 128.0
best_k = float('-inf')
closest_avg_diff = float('inf')
for k in range(-255, 256):
new_sum = 0
for value in img:
new_value = value + k
new_value = max(0, min(255, new_value))
new_sum += new_value
new_avg = new_sum / n
avg_diff = abs(new_avg - target)
if avg_diff < closest_avg_diff or (avg_diff == closest_avg_diff and k < best_k):
closest_avg_diff = avg_diff
best_k = k
return best_k
# 读取输入
img = list(map(int, input().split()))
# 计算并输出最佳k值
print(find_best_k(img))
代码说明
- find_best_k函数:实现了寻找最佳k值的逻辑。通过遍历可能的k值,计算每个像素点加上k后的新值,并限制在[0, 255]范围内,计算新平均值,并找到最接近128的平均值对应的k。
- 读取输入:通过
input().split()
读取一行输入,并转换为整数列表。 - 计算并输出最佳k值:调用
find_best_k
函数计算最佳k值,并输出结果。
这个Python程序能够找到最优的k值,使得新图像的平均像素值最接近128,并输出结果。你可以在Python环境中运行这个程序来实现该功能。