1 条题解
-
0
#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
- 上传者