题目描述
一个图像有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″
用例
| 输入 | 129 130 129 130 | 
| 输出 | -2 | 
| 说明 | -1的均值128.5,-2的均值为127.5,输出较小的数-2 | 
题目解析
问题描述
给定一个包含n个像素点的数组img,每个像素点的取值范围为[0, 255]的整数。需要找到一个整数k,使得将每个像素点的值加上k后,新图像newImg的所有像素点的平均值最接近128。
输入描述
输出描述
备注
- 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。
解题思路
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环境中运行这个程序来实现该功能。