每日一题 | 大考试分数问题
点击上方蓝字,关注并星标,和我一起学技术。
昨日题解
每日一题 | 字符串转换问题
这道题同样来源于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 == :
zeros.append(c)
else:
ones.append(c)
ones_, zeros_ = [], []
for c in b:
if (ord(c) - ord('a')) % 2 == :
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 -
相关文章