2 条题解

  • 0
    @ 2026-10-8 6:09:57

    • 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
      难度
      9
      标签
      (无)
      递交数
      7
      已通过
      5
      上传者