1 条题解

  • 0
    @ 2026-2-3 11:46:48
    #include <iostream>
    #include<algorithm>
    using namespace std;
    int n;
    int a[21][42]; //把字符串转换成数字以后存在二维数组里 
    string arr[21];
    int pixel[256]; //像素 
    struct xiangsu {
        int n16; //16进制对应的10进制数字 
        int cnt; //出现的次数 
        int id; //按次数从大到小排序后的序号 
    }xs[256];
    bool cmp(xiangsu a, xiangsu b) {
        if (a.cnt == b.cnt)
            return a.n16 < b.n16;
        else
            return a.cnt > b.cnt;
    }
    int main() { //B3851 [GESP202306 四级] 图像压缩
        cin >> n;
        for (int i = 0;i < n;i++) {
            cin >> arr[i];
            for (int j = 0;j < arr[i].length();j += 2) {
                int p = 0; //临时用来累加的两位16进制数字 
                switch (arr[i][j]) {
                case 'A':p = 10;break;
                case 'B':p = 11;break;
                case 'C':p = 12;break;
                case 'D':p = 13;break;
                case 'E':p = 14;break;
                case 'F':p = 15;break;
                default:p = (arr[i][j] - '0');
                }
                switch (arr[i][j + 1]) {
                case 'A':p = p * 16 + 10;break;
                case 'B':p = p * 16 + 11;break;
                case 'C':p = p * 16 + 12;break;
                case 'D':p = p * 16 + 13;break;
                case 'E':p = p * 16 + 14;break;
                case 'F':p = p * 16 + 15;break;
                default:p = p * 16 + (arr[i][j + 1] - '0');
                }
                pixel[p]++;
                a[i][j / 2] = p;
            }
        }
        for (int i = 0;i < 256;i++) {
            xs[i].n16 = i; //像素点n16 
            xs[i].cnt = pixel[i]; //出现的次数 
        }
        sort(xs, xs + 256, cmp);
        pair<int, int> pa[16];
        for (int i = 0;i < 16;i++) {
            xs[i].id = i;
            pa[i].first = xs[i].n16; //first是灰度值 
            pa[i].second = xs[i].id; //second 是排序号的序号 
            printf("%02X", xs[i].n16);
        }
        cout << endl;
        bool b = true; //是否要继续填
        for (int i = 0;i < n;i++) {
            for (int j = 0;j < arr[0].length() / 2;j++) {
                //cout<<a[i][j]<<"-";
                b = true;
                for (int m = 0;m < 256 and b;m++) {
                    for (int k = 0;k < 16 and b;k++) {
                        if ((a[i][j] + m) == pa[k].first) {
                            //cout << pa[k].second << " ";
                            printf("%X", pa[k].second);
                            b = false;break;
                        }else
                        if (a[i][j] - m == pa[k].first) {
                            //cout << pa[k].second << " ";
                            printf("%X", pa[k].second);
                            b = false;break;
                        }
                    }
                }
            }
            cout << endl;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1843
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    2
    已通过
    2
    上传者