2 条题解
-
0
#include <bits/stdc++.h> using namespace std; int cnt[256]; int pal[16]; int map2idx[256]; int hex2dec(char c){ if(c>='0'&&c<='9') return c-'0'; return 10+c-'A'; } char dec2hex(int x){ if(x<10) return '0'+x; return 'A'+(x-10); } bool cmp(int a,int b){ if(cnt[a]!=cnt[b]) return cnt[a]>cnt[b]; return a<b; } int main(){ int n;cin>>n; vector<vector<int>> img(n); memset(cnt,0,sizeof cnt); for(int i=0;i<n;i++){ string s;cin>>s; for(int j=0;j<(int)s.size();j+=2){ int v=hex2dec(s[j])*16+hex2dec(s[j+1]); img[i].push_back(v); cnt[v]++; } } vector<int> all; for(int i=0;i<256;i++) if(cnt[i]>0) all.push_back(i); sort(all.begin(),all.end(),cmp); for(int i=0;i<16;i++) pal[i]=all[i]; for(int g=0;g<256;g++){ int best=0; for(int i=1;i<16;i++){ int d1=abs(g-pal[i]); int d0=abs(g-pal[best]); if(d1<d0||(d1==d0&&i<best)) best=i; } map2idx[g]=best; } for(int i=0;i<16;i++){ cout<<dec2hex(pal[i]/16)<<dec2hex(pal[i]%16); } cout<<endl; for(int i=0;i<n;i++){ for(int v:img[i]) cout<<dec2hex(map2idx[v]); cout<<endl; } return 0; } //:) //114514 -
0
虽然只有一种味道,但真的很 鲜~
葵花籽味
#include <cmath> //abs #include <cstdio> //scanf, printf #include <string> //string #include <iostream> //cin #include <algorithm> //sort using namespace std; int mp[25][25], choose[25]; //choose:找出的16个数字 class cnter { public: int num, cnt; //还要知道是什么数字,排序之后才不会乱 } cnt[260]; int main() { int n; scanf("%d", &n); int m; for(int i=1;i<=n;i++) { string str; cin >> str; m = str.size()/2; for(int j=1;j<=m;j++) { char c1 = str[j*2-2], c2 = str[j*2-1]; int a1, a2; if(c1 >= '0' && c1 <= '9') a1 = c1 - '0'; else a1 = c1 - 'A' + 10; if(c2 >= '0' && c2 <= '9') a2 = c2 - '0'; else a2 = c2 - 'A' + 10; mp[i][j] = a1*16+a2; //16 to 10 cnt[mp[i][j]].cnt++; //计数++ cnt[mp[i][j]].num = mp[i][j]; //设置数字 } } sort(cnt, cnt + 256, [](cnter x, cnter y) { return x.cnt > y.cnt || x.cnt == y.cnt && x.num < y.num; }); //排序 for(int i=0;i<16;i++) { choose[i] = cnt[i].num; int a = choose[i]/16, b = choose[i]%16; printf("%c%c", (a <= 9)?(a + '0'):(a + 'A' - 10), (b <= 9)?(b + '0'):(b + 'A' - 10)); //10 to 16 //printf(":%d\n", cnt[i].cnt); //debug语句 } putchar('\n'); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { int num = mp[i][j]; int minn = 2147483647, mink; for(int k=0;k<16;k++) { if(abs(num - choose[k]) < minn) { minn = abs(num - choose[k]); mink = k; } } putchar(mink <= 9 ? mink+'0' : (mink + 'A' - 10)); //10 to 16 } puts(""); } return 0; }
- 1
信息
- ID
- 3450
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 7
- 已通过
- 3
- 上传者