第一次提交60分,看了一天也不知道哪里错了,后来看了题解,才看到问题在哪里。
题目里面有这样一句话:
如果绝对值相等,则编号较小的灰阶更近。
但是当你把这个条件加上,就只有60分,不加这个条件就能AC。
这个到底是什么问题。 下面是AC代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,a[25][25],b[25][25],vis[256],p[256];
int c(char c1,char c2) {
int num = 0;
if(c1 <= '9' && c1 >= '0') num += (c1 - '0')*16;
else num += (c1 - 'A' + 10)*16;
if(c2 <= '9' && c2 >= '0') num += (c2 - '0')*1;
else num += (c2 - 'A' + 10)*1;
return num;
}
void init() {
for(int i = 0;i <= 255;i++) p[i] = i;
}
bool cmp(int x,int y) {
return vis[x] > vis[y] || (vis[x] == vis[y] && x < y);
}
int judge(int x) {
int md = 300,id;
for(int i = 0;i < 16;i++) {
if(abs(x - p[i]) < md) {
md = abs(x - p[i]), id = i;
}//else if(abs(x - p[i]) == md) {
// if(p[id] > p[i]) id = i;
//}
}
return id;
}
int main( ) {
init();
cin >> n;
string s;
for(int i = 1;i <= n;i++) {
cin >> s;
m = s.size();
char c1,c2;
for(int j = 0;j < m;j += 2) {
c1 = s[j],c2 = s[j+1];
a[i][j/2+1] = c(c1,c2);
vis[a[i][j/2+1]]++;
}
}
sort(p,p+256,cmp);
for(int i = 0;i < 16;i++) printf("%02X",p[i]);
printf("\n");
for(int i = 1;i <= n;i++) {
for(int j = 1;j <= m/2;j++) {
printf("%X",judge(a[i][j]));
}
printf("\n");
}
return 0;
}
这个是60分代码,唯一差别就是加了这个条件。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,a[25][25],b[25][25],vis[256],p[256];
int c(char c1,char c2) {
int num = 0;
if(c1 <= '9' && c1 >= '0') num += (c1 - '0')*16;
else num += (c1 - 'A' + 10)*16;
if(c2 <= '9' && c2 >= '0') num += (c2 - '0')*1;
else num += (c2 - 'A' + 10)*1;
return num;
}
void init() {
for(int i = 0;i <= 255;i++) p[i] = i;
}
bool cmp(int x,int y) {
return vis[x] > vis[y] || (vis[x] == vis[y] && x < y);
}
int judge(int x) {
int md = 300,id;
for(int i = 0;i < 16;i++) {
if(abs(x - p[i]) < md) {
md = abs(x - p[i]), id = i;
}else if(abs(x - p[i]) == md) {
if(p[id] > p[i]) id = i;
}
}
return id;
}
int main( ) {
init();
cin >> n;
string s;
for(int i = 1;i <= n;i++) {
cin >> s;
m = s.size();
char c1,c2;
for(int j = 0;j < m;j += 2) {
c1 = s[j],c2 = s[j+1];
a[i][j/2+1] = c(c1,c2);
vis[a[i][j/2+1]]++;
}
}
sort(p,p+256,cmp);
for(int i = 0;i < 16;i++) printf("%02X",p[i]);
printf("\n");
for(int i = 1;i <= n;i++) {
for(int j = 1;j <= m/2;j++) {
b[i][j] = judge(a[i][j]);
printf("%X",b[i][j]);
}
printf("\n");
}
return 0;
}