【备战秋招】每日一题:2022.11.27-华为机试-平均像素值

为了更好的阅读体检,可以查看我的算法学习网
本题在线评测链接:P1030

题目内容

塔子哥是一名摄影师,他刚刚拍摄了一组照片,但是由于光线等原因,照片的整体色调偏暗。他想要将每个像素点的亮度值都加上一个适当的值,来提高整张照片的亮度。同时,他希望加上的值不会使照片的亮度变得过于明亮或过于昏暗,而是尽可能地接近中间值 128。

给定一个长度为 n n n 的数组 i m g img img,表示一张图像的 n n n 个像素点,每个像素点的取值范围为 [ 0 , 255 ] [0, 255] [0,255] 的正整数。塔子哥需要找到一个整数 k k k,将数组 i m g img img 中的每个元素都加上 k k k,得到一个新的数组 n e w I m g newImg newImg,使得 n e w I m g newImg newImg 的所有像素的平均值最接近中位值 128。最后,输出这个整数 k k k

输入描述

输入 n n n 个整数,中间用空格分隔。

1 ≤ n ≤ 100 1\le n \le 100 1n100

输出描述

输出满足条件的 k k k

如果有多个满足条件的k输出最小的那个

注意: 新图的像素值会自动截取到 [ 0 , 255 ] [0,255] [0,255] 范围,如,当像素点值 < 0 <0 <0 是,其值会自动更新为 0 0 0

样例

样例一

输入

0 0 0 0

输出

128

样例二

输入

129 130 129 130

输出

-2

样例解释

− 1 -1 1 的均值 128.5 128.5 128.5 , − 2 -2 2 的均值为 127.5 127.5 127.5 ,输出较小的数 − 2 -2 2

题目思路

注意到整数 k k k 的范围不大,最低不会低于 − 255 -255 255,最高不会到 255 255 255 ,所以直接枚举这个范围内的每个数作为 k k k ,然后得到最优解即可。

代码

Python代码

def get(x):		#由计算结果得到实际结果
	if x < 0:
		return 0
	if x > 255:
		return 255
	return x

img = list(map(int, input().split()))	#输入img数组
res, mi = 0, float('inf')			#初始化最小值为正无穷
for i in range(-255, 256):
	avage = sum([get(j+i) for j in img])	#计算平均值
	now = abs(avage  - 128*len(img))		#得到和128的距离
	if now < mi:		#如果比最小值小
		res, mi = i, now	#就更新答案
print(res)	#输出最终答案

C++代码

#include <iostream>
using namespace std;

int get(int x){
    if (x<0)
        return 0;
    if (x>255)
        return 255;
    return x;
}
int a[105];
int main()
{
    int cnt=0;
    while(cin>>a[cnt]) {
        cnt++;
    }
    int res=0,mi=100000000;
    for (int i=-255;i<=255;i++){
        int sum=0;
        for (int j=0;j<cnt;j++)
            sum+=get(a[j]+i);
        int now=abs(sum-128*cnt);
        if (now<mi)
        {
            mi=now;
            res=i;
        }
    }
    cout<<res<<endl;
    return 0;
}

Java代码

import java.io.Console;
import java.util.Scanner;

class Main {
    public static int get(int x) {
        if (x < 0)
            return 0;
        if (x > 255)
            return 255;
        return x;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int cnt = 0;
        int[] a = new int[105];
        while (scanner.hasNext()) {
            a[cnt] = scanner.nextInt();
            cnt++;
        }
        int res = 0, mi = 100000000;
        for (int i = -255; i <= 255; i++) {
            int sum = 0;
            for (int j = 0; j < cnt; j++)
                sum += get(a[j] + i);
            int now = Math.abs(sum - 128 * cnt);
            if (now < mi) {
                mi = now;
                res = i;
            }
        }
        System.out.println(res);
    }
}

Js代码

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';

process.stdin.on('data', (data) => {
	input += data;
	return;
});
process.stdin.on('end', () => {
    function get(x) {
        if (x < 0)
            return 0;
        if (x > 255)
            return 255;
        return x;
    }
    input=input.split('\n');
    let a=input[0].split(' ');
    let cnt=a.length;
    for (let i=0;i<cnt;i++)
        a[i]=Number(a[i]);
    let res = 0, mi = 100000000;
    for (let i = -255; i <= 255; i++) {
        let sum = 0;
        for (let j = 0; j < cnt; j++)
            sum += get(a[j] + i);
        let now = Math.abs(sum - 128 * cnt);
        if (now < mi) {
            mi = now;
            res = i;
        }
    }
    console.log(res);
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔子哥学算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值