社区讨论

60pts求助

B3851[GESP202306 四级] 图像压缩参与者 4已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@m0atqsp4
此快照首次捕获于
2024/08/26 17:57
2 年前
此快照最后确认于
2025/11/04 22:22
4 个月前
查看原帖
改了几遍感觉没问题 但是wa四个点
Code:
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=50,CNT_MAX=300,inf=1e9+5;
struct CNT{
    int dec,cnt;
    string hex;
    bool operator < (const CNT &u)const{
        if (cnt==u.cnt)return dec<u.dec;
        return cnt>u.cnt;
    }
};
bool isBased[CNT_MAX];
int n;
int cnt[CNT_MAX];
vector<int> g[N];
vector<CNT> _count;
int base[CNT_MAX];
int charset_toDec[6]={10,11,12,13,14,15};
char charset_toHex[6]={'A','B','C','D','E','F'};
int toDec(string hex){
    int k=1,res=0;
    for (int i=hex.length()-1;i>=0;i--){
        char c=hex[i];
        int num;
        if ('A'<=c&&c<='F')num=charset_toDec[c-'A'];
        else num=c-'0';
        res+=num*k;
        k*=16;
    }
    return res;
}
string toHex(int dec){
    if (dec==0)return "0";
    string res;
    stack<char> st;
    while(dec){
        int num=dec%16;
        if (0<=num&&num<=9)st.push(num+'0');
        else if (10<=num&&num<=15)st.push(charset_toHex[num-10]);
        dec/=16;
    }
    while(!st.empty()){
        res+=st.top();
        st.pop();
    }
    return res;
}
signed main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    for (int i=0;i<=256;i++)cnt[i]=inf;
    for (int i=0;i<=256;i++)base[i]=inf;
    /*for (int i=1;i<=155;i++)cout<<cnt[i]<<" ";
    cout<<"\n";*/
    cin>>n;
    for (int i=1;i<=n;i++){
        string s;
        cin>>s;
        for (int j=0;j<(int)s.length();j+=2){
            string hex=s.substr(j,2);
            int dec=toDec(hex);
            g[i].push_back(dec);
            if (cnt[dec]>(int)1e9)cnt[dec]=0;
            cnt[dec]++;
        }
    }
    //处理cnt
    for (int i=0;i<=255;i++){
        if (cnt[i]>(int)1e9){continue;}
        string hex=toHex(i);
        if (hex.length()!=2)hex.insert(0,"0");
        _count.push_back({i,cnt[i],hex});
    }
    sort(_count.begin(),_count.end());
    for (int i=0;i<=15;i++){
        cout<<_count[i].hex;
        base[_count[i].dec]=i;
        isBased[_count[i].dec]=1;
    }
    cout<<"\n";
    for (int i=1;i<=n;i++){
        for (const auto &j:g[i]){
            if (isBased[j])cout<<toHex(base[j]);
            else{
                int minn=INT_MAX,id;
                for (int k=0;k<=255;k++){
                    if (base[k]>(int)1e9)continue;
                    if (abs(k-j)<minn){
                        minn=abs(k-j);
                        id=k;
                    }
                }
                cout<<toHex(base[id]);
            }
        }
        cout<<"\n";
    }
}

回复

3 条回复,欢迎继续交流。

正在加载回复...