2024华为OD试题及答案-A023-简单的自动曝光、平均像素值

题目描述

一个图像有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。

解题思路

  1. 计算初始平均值:首先计算输入像素点的初始平均值。
  2. 寻找合适的k:为了使新图像的平均值最接近128,我们需要计算每个像素加上k后的值,并限制在[0, 255]范围内。
  3. 计算最佳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;
}

代码说明

  1. 读取输入:读取像素点个数n和n个像素值。
  2. 初始化目标和最优参数:目标平均值为128,初始化最优k为最小整数,最接近平均值的差异为最大浮点数。
  3. 遍历可能的k值:从-255到255,计算每个像素点加上k后的新值,并限制在[0, 255]范围内,计算新平均值。
  4. 更新最优k值:比较新平均值与目标平均值的差异,更新最优k值。
  5. 输出结果:输出最优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))

代码说明

  1. find_best_k函数:实现了寻找最佳k值的逻辑。通过遍历可能的k值,计算每个像素点加上k后的新值,并限制在[0, 255]范围内,计算新平均值,并找到最接近128的平均值对应的k。
  2. 读取输入:通过input().split()读取一行输入,并转换为整数列表。
  3. 计算并输出最佳k值:调用find_best_k函数计算最佳k值,并输出结果。

这个Python程序能够找到最优的k值,使得新图像的平均像素值最接近128,并输出结果。你可以在Python环境中运行这个程序来实现该功能。

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值