Content

给定一个 十六进制颜色码(一个长度为 \(7\) 的字符串,意义详见题面),请输出其反色的十六进制颜色码。

数据范围:颜色的 R,G,B 值保证在 \(255\) 以内。

Solution

我们不妨设给定的两个特殊的限制为 Subtask 1 和 Subtask 2,其余的数据分为 Subtask 3。然后我们来按照三个 Subtask 分别讲解。

Subtask 1

这个对于萌新来说都很容易上手,直接输出 #000000 即可。

Subtask 2&3

开始之前我们有必要讲一讲十六进制。当然如果对此很熟悉的话可以跳过去。

正如题面所说,十六进制数码从小到大包括 \(\textsf{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}\) 十六个数码,正如其名,这样的数字 满十六进一,而不像我们通常所用的十进制一样 满十进一,而又因为没有这么多的数字可以存十六进制数码,因此借用了字母表中的大写字母。

那么如何将十六进制转换成十进制呢?我们知道,十六进制的数 满十六进一,那么我们如果进了一,这一位上面的十六个单位全部转化为了它前面这一位上的一个单位。所以,我们不妨假设最低位为第 \(0\) 位,那么一个十六进制数第 \(i\) 位上的数字就可以转化为 \(num_i\times16^i\)。那么,十进制转换成十六进制的话也就很简单了,直接从大到小提取出一个数乘以 \(16\) 的次幂,最后拼合在一起就好。

这么说可能不是很友好,我就拿样例 \(2\) 来具体操作一番吧。

input:
#EBA932
output:
#1456CD

然后我们来看如何操作:

首先是 R 值。提取出来的话就是 \(\text{EB}\),然后我们清楚,\(\text{E}\) 代表 \(14\),\(\text{B}\) 代表 \(11\),所以 \((\text{EB})_{16}=14\times16^1+12\times16^0=14\times16+12=235\)。然后他的反色就是 \(255-235=20\)。所以我们提取出 \(1\times16\) 的 \(1\) 次幂和 \(4\times 16\) 的 \(0\) 次幂,那么最终的 R 值就是 \(14\)。

G 值和 B 值的操作同上,想必无需多讲了。

那么对于 Subtask 2,我们的任务就很简单,直接将十六进制数字转化成十进制数字连特判字母都不需要,然后再根据题目里面给出的式子,我们拿这个数去减 \(255\),得到的就是反色的十进制数码。Subtask 3 就需要特判一下是不是字母了。然后我们再把十进制的反色数码转换成十六进制的就好了。而且特别良心的是,这里的数字都只有两位,所以特别好直接模拟操作。


所以说这道题目就做完了

……吗?

虽然说问题不大,但是从十六进制转到十进制再转回十六进制是不是太麻烦了?

能否直接十六进制之间互相转换呢?

也就是说,相当于一个,十六进制减法之类的东西?

我们再来看看,我们可以自己手玩一下,发现 \((255)_{10}=(\text{FF})_{16}\)。那么不就可以弄个减法直接减一下就好了?而且可以很惊喜的发现,这减法居然还不需要考虑退位!那么对于每个数位直接拿 \(15\)(\(\text{F}\) 代表 \(15\))减去这个数码就好了。

最后给刚学 OI 的萌新们弄个温馨提示:C++ 里面是可以直接给一个变量赋值为一个十六进制数的,方法是在这个十六进制数之前加一个 \(\textsf{0x}\),然后所有在这道题目里面大写的字母全部都要转化为小写。还给你们几个数,用来以后初始化最小值用的:\(\textsf{0x3f3f3f3f},\textsf{0x7fffffff}\),这种类型的数将会伴随着你们整个 OI 生涯,直到 AFO(Away from OI,也就是退役)。当然,至少对于快要 AFO 的我是这样子的。

最后,祝各位 NOIP2020 RP++!

Code 1

赛时代码,使用了 map 来映射,各位也可以尝试不使用 map 来实现这种做法。

const string ans = "0123456789ABCDEF";
string s;
map<char, int> mp; int main() {
for(int i = 0; i < 16; ++i) mp[ans[i]] = i;
cin >> s;
int r1 = mp[s[1]] * 16 + mp[s[2]], r2 = mp[s[3]] * 16 + mp[s[4]], r3 = mp[s[5]] * 16 + mp[s[6]];
int g1 = 255 - r1, g2 = 255 - r2, g3 = 255 - r3;
printf("#%c%c%c%c%c%c", ans[g1 / 16], ans[g1 % 16], ans[g2 / 16], ans[g2 % 16], ans[g3 / 16], ans[g3 % 16]);
return 0;
}

Code 2

怕各位看不懂这么长的一大串三目运算符,特地在下面写了等效语句,并附上详尽注释。

string s;

int main() {
cin >> s;
F(i, 0, 6) putchar(i == 0 ? '#' : (isdigit(s[i]) ? (s[i] - '0' <= 5 ? 'A' + (5 - (s[i] - '0')) : 15 - (s[i] - '0') + '0') : 5 - (s[i] - 'A') + '0'));
//以下为等效语句
F(i, 0, 6) {
if(i == 0) putchar('#'); //第一位要输出#
else if(isdigit(s[i])) { //判断是否是数字,可以直接调用isdigit函数
if(s[i] <= '5') putchar('A' + (5 - (s[i] - '0'))); //如果数字小于等于5,那么反色数码肯定是一个字母,所以需要特判一下
/*
我们发现,这个数码比 0 差多少,反色数码比 A 就要多多少
所以直接加上这个差值即可
*/
else putchar(15 - (s[i] - '0') + '0'); //直接拿这个数去减 15 然后再转化为字符
} else putchar(5 - (s[i] - 'A') + '0'); //否则肯定会是一个大写字母
/*
我们发现,这个数码比 A 差多少,反色数码比 0 就要多多少
所以直接加上这个差值即可
*/
}
return 0;
}

都看到这里了,点个好评再走呗qwq。

LuoguP7106 双生独白 题解的更多相关文章

  1. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  2. poj3352 Road Construction & poj3177 Redundant Paths (边双连通分量)题解

    题意:有n个点,m条路,问你最少加几条边,让整个图变成边双连通分量. 思路:缩点后变成一颗树,最少加边 = (度为1的点 + 1)/ 2.3177有重边,如果出现重边,用并查集合并两个端点所在的缩点后 ...

  3. BZOJ5248:[九省联考2018]一双木棋——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5248 https://www.luogu.org/problemnew/show/P4363#su ...

  4. [SOJ #687]双生串(2019-11-6考试)/[hdu5431]AB String

    题目大意 把所有仅包含\(AB\)的字符串按字典序排列,给你一个仅包含\(AB\)的字符串\(S\),然后有\(Q\)个问题,第\(i\)个问题给你\(k_i\),求不是\(S\)的子串中,第\(k_ ...

  5. BZOJ2457 双端队列 题解

    本题直接求解十分困难,因为在不知道整个序列的数字规律时当前所作决策都无法保证最优性. 考虑正难则反,题目转化为将一个非降序列分成尽量少的几段,让每段对应原问题的双端队列. 先将原数组排序,由于原数组下 ...

  6. noi省选 [九省联考2018]一双木棋题解(状压dp)

    比浙江简单多了........ 题目转送:https://www.luogu.org/problemnew/show/P4363 分析: 我们注意到n和m都很小,考虑一下状压dp. 显然,棋子摆成的形 ...

  7. LeetCode双周赛#33 题解

    5480. 可以到达所有点的最少点数目 #贪心 题目链接 题意 给定有向无环图,编号从0到n-1,一个边集数组edges(表示从某个顶点到另一顶点的有向边),现要找到最小的顶点集合,使得从这些点出发, ...

  8. Leetcode 双周赛#32 题解

    1540 K次操作转变字符串 #计数 题目链接 题意 给定两字符串\(s\)和\(t\),要求你在\(k\)次操作以内将字符串\(s\)转变为\(t\),其中第\(i\)次操作时,可选择如下操作: 选 ...

  9. POJ 3177 Redundant Paths(边双连通分量)

    [题目链接] http://poj.org/problem?id=3177 [题目大意] 给出一张图,问增加几条边,使得整张图构成双连通分量 [题解] 首先我们对图进行双连通分量缩点, 那么问题就转化 ...

随机推荐

  1. 【.NET 与树莓派】MPD 的 Mini-API 封装

    在前面的水文中,一方面,老周向各位同学介绍了通过 TCP 连接来访问 MPD 服务:另一方面,也简单演示了 ASP.NET Core 的"极简 API"(Mini API).本篇老 ...

  2. IT公司都不喜欢招培训班出来的学生,那培训班的意义何在呢?

        我一方面做过培训学校的老师,现在上班之余,还在培训学校做兼职老师,另一方面做过大厂和外求的技术面试官,主要是java方向的,应该对这个话题有充分的话语权.     在本文里,就从培训班的作用. ...

  3. CF1578J Just Kingdom

    考虑一个点被填满则他需要从其父亲得到\(q_u = \sum_{v = u\ or\ v \in son_u}m_v\) 那么考虑如何这样操作. 我当时world final做的时候,是从上往下遍历, ...

  4. Kubernetes:Pod 升级、回滚

    本篇主要讨论如何实现滚动更新和回滚,任意更换版本并且回滚以前的版本(版本更新),而下一章会讨论到 Pod 缩放,根据机器资源自动拓展和收缩应用(自动扩容实例). 本文为作者的 Kubernetes 系 ...

  5. 【转】群体研究套路:开心果denovo+重测序+转录组+群体进化+选择位点

    转自公众号Eric生信小班.学习群体遗传套路 中科院昆明动物园吴东东研究团队联合国外研究团队2019年在Genome Biology发表题为Whole genomes and transcriptom ...

  6. 【数据库】本地KEGG数据库如何拆分子库?

    目录 KEGG本地库文件 按物种拆分KEGG数据库 1.获得物种分类信息 2.获得物种分类的序列信息并建库 3.获得物种分类的K-ko对应文件 根据相似性原理,序列相似,功能相似,所有功能注释无非是用 ...

  7. void * 指针和const 指针

    1.void * 是不能进行运算的,例如void *p  p++; 这2个值是没有任何规律的. 2 .printf的时候打印void *p 指向的数据,必须强制类型转换,因为编译器不知道取地址多少位. ...

  8. 在Telegraf上报的监控数据中添加固定的标签列

    Telegraf作为InfluxData提供的TICK工具栈(由Telegraf, InfluxDB, Chronograf, Kapacitor四个工具的首字母组成)中收集监控数据的一环,功能非常强 ...

  9. [源码解析] PyTorch 分布式 Autograd (5) ---- 引擎(上)

    [源码解析] PyTorch 分布式 Autograd (5) ---- 引擎(上) 目录 [源码解析] PyTorch 分布式 Autograd (5) ---- 引擎(上) 0x00 摘要 0x0 ...

  10. 使用flock命令查看nas存储是否支持文件锁

    上锁 文件锁有两种 shared lock 共享锁 exclusive lock 排他锁 当文件被上了共享锁之后,其他进程可以继续为此文件加共享锁,但此文件不能被加排他锁,此文件会有一个共享锁计数,加 ...