每日一题 | 最大考试分数问题
昨日题解
这道题同样来源于codeforces,链接:https://codeforces.com/gym/102625/problem/B
这道题干想还是有点难度的,在codeforces当中做出来的人也不多。
我们首先来思考一点,假设没有交换字母时候的限制,那么我们可以肯定,只要两个字符串构成相同,那么一定可以通过交换得到。方法也很简单,我们可以一个字母一个字母地完成。举个例子,比如说假设a是第一个字母,我们现在的情况是xxxxaxxxx,很显然我们只需要把a一个一个往前交换,就可以得到axxxxxx。同理,我们可以如法炮制后面的每一个字母。这种方法虽然交换的次数多,但是一定可以得到解。
问题是题目当中并不能这么随意的交换,只有被两个不同的人喜欢的相邻字母才可以交换。我们通过通过字母的ascii码很容易得知每一个字母分别被哪一个人喜欢,但问题是我们怎么判断在这样的限制条件下是否存在解呢?
一般人想到了这里就思维就停止了,好像进入了一个死胡同,怎么也钻不出来。实际上也的确如此,如果我们从思考如何判断的角度出发,可能怎么也不会想到合适的解。尤其是这题给定的范围还很大,字符串的长度在10的五次方这个量级。这个时候就需要我们冷静下来,仔细分析。
这道题是一道非常经典的观察型问题,这样的题目正面硬攻几乎是无法破解的,解法往往藏在一个隐蔽的结论当中。这个结论通常需要我们对问题进行深入思考和分析之后才可以得到。一旦发现了这个结论,那么题目也就不攻自破。这类题目与其说考察的是选手的思维能力,不如说也是考察经验和思维模型,遇到难题的时候是否有一个正确的内核逻辑和解题步骤才是更关键的。
我们回到这道题本身,我们把被同一个人喜欢的字母看成是属于同一个集合。也就是说只有属于不同集合的字母才可以交换,我们进一步可以发现,由于这个限制的存在,两个属于同一集合的字符的相对位置是不能更改的。那么剩下的就好办了,如果A和B两个字符串相同集合的元素的相对位置不同,那么说明无法通过交换得到。
举个例子,比如说abc,a和c属于同一个集合,b属于另外一个集合,我们无论怎么交换,也不可能使得c出现在a前面。因为a要想出现在c前面,必须要与c发生交换,但是题目限制了同一个集合当中的字符不允许交换。既然如此,那么就简单了,我们只需要把两个字符串中的字符拆分到两个集合当中,最后比较一下两个字符串对应的集合的元素组成以及相对位置是否一样,如果完全一样,那么说明可以通过交换得到,否则说明不行。
说起来有一点点绕,我们看下代码,相信不难理解。
a = input()
b = input()
ones = []
zeros = []
for c in a:
# 把a字符串当中的字母拆分到zeros和ones两个集合当中
if (ord(c) - ord('a')) % 2 == 0:
zeros.append(c)
else:
ones.append(c)
ones_, zeros_ = [], []
for c in b:
if (ord(c) - ord('a')) % 2 == 0:
zeros_.append(c)
else:
ones_.append(c)
# 比较两个字符串拆分出来的集合是否相等
flag = ones == ones_ and zeros == zeros_
print('Yes' if flag else 'No')
从代码上来看,这段代码非常简单,几乎没有什么特别的操作。但是要通过缜密的思维逻辑想到这一点,却并不容易。
今日问题
考试分数问题
最近期末季到了,有一个学生A参加了N门考试,由于对自己的成绩不理想,A找到了老师安排重考刷新成绩。已知老师可以安排m次重考,每次重考最多可以把
门成绩刷新到
分。A希望通过重考让考试的总成绩尽可能大,请问他能获得的最大的总成绩是多少?
第一行两个数表示N和M,第二行表示N们课程当前的成绩,之后跟着m行,每一行有两个数,分别表示Bi和Ci。
在第一个例子当中我们将第二门成绩重考,刷新到5分,这样可以得到总成绩是5 + 5 + 4 = 14分。
- END -
- 贪心算法(四)——最小代价生成树
- 贪心算法(五)——迪杰斯特拉算法
- Tensorflow动态seq2seq使用总结
- 卷积神经网络中PET/CT图像的纹理特征提取
- 深入剖析Spring(四)——AOP
- Java并发编程的艺术(十二)——线程安全
- 用 LSTM 做时间序列预测的一个小例子
- Java并发编程的艺术(十一)——线程池(2)
- Java并发编程的艺术(十)——线程池(1)
- Tensorflow on Spark爬坑指南
- Boost asio 官方教程
- 0基础教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)
- 柴毛毛大话设计模式——开发常用的设计模式梳理
- Redis源码分析(四)——Redis数据结构-整数集合
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法