熱門文章

2025年6月4日 星期三

ZeroJudge 解題筆記:m900. 色彩轉換 (Color)

作者:王一哲
日期: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;
}


沒有留言:

張貼留言