题目链接:点击打开链接
题意:
在CSS中我们可以用井号(#)加6位十六进制数表示一种颜色,例如#000000是黑色,#ff0000是红色,#ffd700是金色。
同时也可以将六位颜色#RRGGBB简写为#RGB三位颜色。例如#000与#000000是相同的,#f00与#ff0000是相同的,#639与#663399是相同的。
对于两个颜色#abcdef和#ghijkl,我们定义其距离是(ab - gh)2 + (cd - ij)2 + (ef - kl)2。(其中ab, cd, ef, gh, ij, kl都是十六进制数,也即0~255的整数)
给定一个六位颜色#abcdef,请你求出距离它最近的三位颜色#rgb。
题解:题意确实不好懂,就是求3次一个两位十六进制的数字,距离个位和十位相同的十六进制数距离近。暴力膜一下就过了。
#include<bits/stdc++.h>
using namespace std;
int main(){
map<char,int> m;
m['0'] = 0;
m['1'] = 1;
m['2'] = 2;
m['3'] = 3;
m['4'] = 4;
m['5'] = 5;
m['6'] = 6;
m['7'] = 7;
m['8'] = 8;
m['9'] = 9;
m['a'] = 10;
m['b'] = 11;
m['c'] = 12;
m['d'] = 13;
m['e'] = 14;
m['f'] = 15;
map<int,char> mm;
mm[0] = '0';
mm[17] = '1';
mm[34] = '2';
mm[51] = '3';
mm[68] = '4';
mm[85] = '5';
mm[102] = '6';
mm[119] = '7';
mm[136] = '8';
mm[153] = '9';
mm[170] = 'a';
mm[187] = 'b';
mm[204] = 'c';
mm[221] = 'd';
mm[238] = 'e';
mm[255] = 'f';
char a[10];
while(~scanf("%s",a)){
int x1 = m[a[1]]*16+m[a[2]];
int x2 = m[a[3]]*16+m[a[4]];
int x3 = m[a[5]]*16+m[a[6]];
//cout << x1 <<" "<< x2<<" " << x3<<endl;
int min1 = 1e9;
int flag1,flag2,flag3;
int min2 = 1e9;
int min3 = 1e9;
for(int i = 0 ; i <= 255 ; i += 17 ){
// cout << i << endl;
// cout << "min1"<<(i-x1) * (i-x1) << endl;
// cout <<"min" <<min1 << endl;
if((i-x1) * (i-x1) < min1){
min1 = (i-x1) * (i-x1);
flag1 = i;
}
if((i-x2) * (i-x2) < min2){
min2 = (i-x2) * (i-x2);
flag2 = i;
}
if((i-x3) * (i-x3) < min3){
min3 = (i-x3) * (i-x3);
flag3 = i;
}
}
// cout << flag1 << " " << flag2 << " " << flag3 << endl;
cout << "#"<<mm[flag1] <<mm[flag2]<<mm[flag3]<<endl;
}
}