# Greedy# Math# Simulation

b462 - 圖片亮度調整原理深度剖析

🔗 前往 ZeroJudge 原題

題目描述

題目要求對輸入的 RGB 圖片進行亮度調整,調整方式為對每個顏色通道 (R, G, B) 分別應用一個一次函數 f(x) = ax + b。需要確保調整後的像素值在 0 到 255 的範圍內,並進行四捨五入。

解題思路

題目給定了六個參數 aR, bR, aG, bG, aB, bB,分別對應 R, G, B 三個通道的一次函數的斜率和截距。程式碼讀取圖片的寬高 w, h,然後遍歷每個像素的 RGB 值,對每個顏色通道應用對應的一次函數,並將結果限制在 0 到 255 的範圍內。最後輸出調整後的圖片。

複雜度分析

  • 時間複雜度: O(w * h),其中 w 是圖片的寬度,h 是圖片的高度。程式碼需要遍歷每個像素進行計算。
  • 空間複雜度: O(1),程式碼只使用了常數級別的額外空間。

程式碼

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	double aR,bR,aG,bG,aB,bB,a,b,c;
	int w,h;
	cin >> aR >> bR >> aG >> bG >> aB >> bB >> w >> h;
	cout << w << " " << h << "\n";
	for(int i(0);i<h;++i){
		for(int j(0);j<w;++j){
			cin >> a >> b >> c;
			a=a*aR+bR;
			b=b*aG+bG;
			c=c*aB+bB;
			if(a<0)a=0;
			if(b<0)b=0;
			if(c<0)c=0;
			if(a>255)a=255;
			if(b>255)b=255;
			if(c>255)c=255;
			cout << round(a) << " " << round(b) << " " << round(c) << " ";
		}
		cout << "\n";
	}
}

Discussion