2 条题解

  • 0
    @ 2026-5-1 11:25:17
    #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
      @ 2026-4-5 22:13:03

      虽然只有一种味道,但真的很 鲜~

      葵花籽味

      #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
      上传者