美文网首页
聪明的班主任

聪明的班主任

作者: 卓技卓品 | 来源:发表于2017-07-07 08:33 被阅读0次

    描述

    某校有一个神奇的班级,班里的人只喜欢语文或者数学或者英语,他们的班主任为此很头疼,因为班主任希望所有人都喜欢同一个科目,经过一番调研后发现,他可以通过自己的花言巧语使两个不同爱好的学生的爱好变成另一个爱好(比如他对一个喜欢语文的和一个喜欢数学的使用花言巧语,那么这二个人都会喜欢英语)那么问,题来了,


    输入

    多组测试样例;每组测试样例有3个数字a,b,c;分别代表这个班喜欢语文,喜欢数学,喜欢英语的人数,(输入数据范围为int型)


    输出

    如果班主任能够通过若干次改变使得所有人都喜欢同一个科目,输出"YES",否则输出"NO"(不带引号);


    样例输入
    1 1 1
    样例输出
    YES
    提示
    注意:班级人数范围为int型


    思路解析:

    要把所有学生的喜好转换成同一科目,其实考虑一下也不是很复杂,只需要满足喜欢语文、数学、英语的学生中,存在两个科目喜欢的学生数量相同或者能够通过转换将其中的两个科目喜欢的学生数量达到相同。这样就能够通过班主任的转换,全部换成同一个科目了。

    思路有了,解决方案也就出来了:

    方案1:

    分别遍历所有的情况,看看能不能找到通过转换达到存在两个科目学生数量一样的情况。这种方式实现起来比较复杂:

    设:喜欢语文、数学、英语的人数分别为:X、Y、Z。那么,需要判断三种情况:
    设数N为:0<=N<=(MAX(Y,Z)),那么对于所有的N判断:(X+2N == Y - N)
    || (X+2N == Z - N),如果存在真的情况,那么班主任就能让所有人喜欢同一个科目。否则,继续判断第二门科目。
    设数N为:0<=N<=(MAX(X,Z)),那么对于所有的N判断:(Y+2N == X - N)
    || (Y+2N == Z- N),如果存在真的情况,那么班主任就能让所有人喜欢同一个科目。否则,继续判断第三门科目。
    设数N为:0<=N<=(MAX(X,Y)),那么对于所有的N判断:(Z+2N == X - N)
    || (Z+2N == Y- N),如果存在真的情况,那么班主任就能让所有人喜欢同一个科目。否则,班主任不能让所有人喜欢同一门课程。
    这个方法就是暴力的遍历一遍,比较直接,但是比较耗时。
    在理解第一种方案的基础之上,想到了第二种方案:这两门课的商

    方案2:

    通过方案1知道,只要能够通过一定的转换,使其中的两门课喜欢的学生数量一样,那么班主任就能让所有人喜欢同一门课了。那么让两门课人数相同的情况是什么样的呢?
    通过考虑,我们发现,当进行转换的时候,总是一门课的人数数量增加2,另外两门课的数量均减少1,那么,我们可以大胆假设,如果存在两门课的人数相差是3的倍数,是不是就能够使这两门课的人数转换到相同呢?
    这里存在一个问题,就是如果两门课相差是3的倍数(即:(a-b)%3 == 0),第三门课同时大于等于这两门课的差与3的商((a-b)/3 <= c)。这种情况下,很显然,a的数量能转化的,和b相同。但是当第三门课的人数小于他们的商时((a-b)/3 > c),能不能满足转换呢?
    我们以1、0、7为例,测试发现,可以转成:0、2、6->2、1、5->1、3、4->3、2、3。发现可以转化。所以我们可以大胆假设,当三门课程中存在两个数的差是3的倍数时,班主任可以将所有人转换成喜欢同一课程。
    具体这个证明以后再补充吧(汗,现在我也只能发现这个规律,而无法总结证明,以后再加吧)。

    总结

    这是一个简单的算法,作为开篇第一题练手。后续再加其他的吧。

    相关文章

      网友评论

          本文标题:聪明的班主任

          本文链接:https://www.haomeiwen.com/subject/ezqlhxtx.html