日期:2025年6月4日
ZeroJudge 題目連結:m900. 色彩轉換 (Color)
解題想法
按照題目給的公式換算即可。
Python 程式碼
使用時間約為 40 ms,記憶體約為 3.3 MB,通過測試。
import sys
for line in sys.stdin:
R, G, B = map(int, line.split()) # 紅、綠、藍比例 0 ~ 255
imax, imin = max(R, G, B), min(R, G, B) # 最大值、最小值
L = imax + imin # 平均值*2
H, S = 0, 0 # H, S 值,預設為 0
### 計算 H ###
if imax == imin: H = 0 # 如果 imax 等於 imin
elif imax == R: # 如果 imax 等於 R
if G >= B: H = 60*(G-B)/(imax-imin) # G 大於等於 B
else: H = 60*(G-B)/(imax-imin) + 360 # G 小於 B
elif imax == G: H = 60*(B-R)/(imax-imin) + 120 # 如果 imax 等於 G
else: H = 60*(R-G)/(imax-imin) + 240 # 如果 imax 等於 B
### 計算 S ###
if imax == imin or L == 0: S = 0 # 如果 imax 等於 imin 或 L 等於 0
elif 0 < L <= 255: S = (imax-imin)/(imax+imin) # 如果 0 < L <= 255
else: S = (imax-imin)/(510-imax-imin) # 如果 L > 255
H, S, L = round(H), round(S*255), round(L/2)
print(H, S, L)
C++ 程式碼
使用時間約為 2 ms,記憶體約為 132 kB,通過測試。
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int main() {
int R, G, B; // 紅、綠、藍比例 0 ~ 255
while(scanf("%d %d %d", &R, &G, &B) != EOF) {
int imax = max(R, max(G, B)), imin = min(R, min(G, B)); // 最大值、最小值
int L = imax + imin; // 平均值*2
float H = 0.0, S = 0.0; // H, S 值,預設為 0.0
/* 計算 H */
if (imax == imin) {
H = 0.0; // 如果 imax 等於 imin
} else if (imax == R) { // 如果 imax 等於 R
if (G >= B) H = 60.0*(G-B)/(imax-imin); // G 大於等於 B
else H = 60.0*(G-B)/(imax-imin) + 360.0; // G 小於 B
} else if (imax == G) { // 如果 imax 等於 G
H = 60.0*(B-R)/(imax-imin) + 120.0;
} else { // 如果 imax 等於 B
H = 60.0*(R-G)/(imax-imin) + 240.0;
}
/* 計算 S */
if (imax == imin || L == 0) {
S = 0.0; // 如果 imax 等於 imin 或 L 等於 0
} else if (L > 0 && L <= 255) { // 如果 0 < L <= 255
S = 1.0*(imax-imin)/(imax+imin);
} else { // 如果 L > 255
S = 1.0*(imax-imin)/(510-imax-imin);
}
printf("%d %d %d\n", int(round(H)), int(round(S*255.0)), int(round(L/2.0)));
}
return 0;
}
沒有留言:
張貼留言