- [GESP202306 四级] 图像压缩
题解
- 2024-10-19 11:07:05 @
#include<bits/stdc++.h>
using namespace std;
string s[25];
int t[300];//统计每个像素出现的次数
int ans1[20];//存前16种数量出现最多的灰阶
int to_10(char c){
if('0'<=c&&c<='9')return c-'0';
return c-'A'+10;
}
char to_16(int c){
if(c<10){
return c+'0';
}else{
return c-10+'A';
}
}
int cmp(int k){//返回距离k最近的点
int dis=1000,ti;
for(int i=0;i<16;i++){
int d = abs(k-ans1[i]);
if(d<dis){
dis=d;
ti=i;
}
}
return ti;
}
int main() {
int n;
cin >> n;
for(int i=0;i<n;i++){
cin >> s[i];
for(int j=0;j<s[i].size();j+=2){
int d=to_10(s[i][j])*16 + to_10(s[i][j+1]);
t[d]++; // 统计每个灰阶出现的次数
}
}
for(int i=0;i<16;i++){
int maxa=-1,indexj;
for(int j=0;j<=255;j++){
if(maxa<t[j]){
maxa = t[j];
indexj = j;
}
}
ans1[i]=indexj;
t[indexj]=-1;
}
for(int i=0;i<16;i++){
cout << to_16(ans1[i]/16)<<to_16(ans1[i]%16);
}
cout << endl;
for(int i=0;i<n;i++){
for(int j=0;j<s[i].size();j+=2){
int d=to_10(s[i][j])*16 + to_10(s[i][j+1]);
d = cmp(d);//找到距离d最近的像素点
cout<< to_16(d);
}
cout << endl;
}
return 0;
}
0 comments
No comments so far...
Information
- ID
- 2111
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 10
- Tags
- (None)
- # Submissions
- 4
- Accepted
- 2
- Uploaded By