绿色计算预赛-第二阶段

第二阶段

第一关-统计分数的麻烦

“绿盟杯”比赛过后,赛事承办方的各位工作人员们就开始分头统计各个参赛队伍和同学的成绩了。赛事规模很大,有10000个队伍参加。经过工作人员认真负责的统计,本来已经统计好了这一万个队伍的分数和排名,并按照排名从高到低依次进行了编号(从110000)但是由于一个非常偶然的因素,导致其中三个编号的数据丢失,而且剩余编号的顺序也全被打乱了。

你需要编写一个程序,根据还保留的统计数据,来判断哪些编号的数据丢失了,并将这些编号按照从小到大的顺序重新拼接为一个新数字,然后计算这个新数字除以11的余数。如丢失了编号为41、17、25的数据,则最后你需要输出的结果是172541除以11的余数。

编程要求

补全右侧代码区中的get_lost_scores(self, scores)函数,找出丢失的三个编号并按指定格式输出一个新数字除以11的余数。函数参数说明如下:
scores 剩余的被打乱顺序的编号,一个字符串列表

测试说明

样例1:
输入:
除15、48、56外的其余9997个数组成的乱序数组
输出:
9
样例2:
输入:
除22、76、83外的其余9997个数组成的乱序数组
输出:
5

官方解答:考查了range()函数、集合set的减法、sorted()函数、

#!/usr/bin/env python
# -*- coding: utf-8 -*-
class GetScores:
    def get_lost_scores(self, scores):
        N = sorted(set(range(1, 100001)) - set(int(x) for x in scores))
        M = str(N[0]) + str(N[1]) + str(N[2])
        print(int(M) % 11)

第二关-最强战队

绿盟和各大名企合作,举办编程能力大赛,需要选拔一支参赛队伍。队伍成员全部来自“绿盟杯”中表现优秀的同学,每个同学都根据在比赛中的表现被赋予了一个能力值。现在被召集的N个同学已经集结完毕,他们按照编号依次站成了一排。

你需要编写一个程序,从N个同学中选出S名同学,要求选出的同学的能力值的乘积最大,且要求被选出的相邻两个同学的编号的差不超过D

编程要求

补全右侧代码区中的get_best_team(self, numbers, abilities, selectedNum, distance)函数,实现找出能力值乘积最大而且满足编号要求的同学并输出。函数参数说明如下:
numbers 召集到的同学的人数,整型
abilities 各个同学的能力值(依次对应不同编号的同学,整型列表,列表的index就是学生的编号)
selectedNum 需要选出的同学的人数,整型
distance 相邻同学的编号的差的最大值,整型

测试说明

样例1:
输入:
3 , [7,4,7] , 2 , 50
输出:
49

官方解答:考查动态规划
https://www.nowcoder.com/questionTerminal/661c49118ca241909add3a11c96408c8?commentTags=C%2FC%2B%2B

>>> [[1,2]*2 for i in range(3)]
[[1, 2, 1, 2], [1, 2, 1, 2], [1, 2, 1, 2]]
>>> (1 << 64) * -1
-18446744073709551616L
>>> (1 << 64) 
18446744073709551616L
>>> (1 << 63)
9223372036854775808L
>>> (1 << 6)
64
>>> (1 << 4)
16
>>> (1 << 2)
4

#!/usr/bin/env python
# -*- coding: utf-8 -*-
class BestTeam:
    def get_best_team(self, numbers,    abilities,  selectedNum, distance):
        dmax = [[0] * numbers for i in range(selectedNum)]
        dmin = [[0] * numbers for i in range(selectedNum)]
        res = (1 << 64) * -1 # 先令res为一个无穷小的数

        for i in range(numbers): # 
            dmax[0][i] = dmin[0][i] = abilities[i]
            for k in range(1, selectedNum):
                for pre in range(max(0, i - distance), i):
                    dmax[k][i] = max(dmax[k][i],
                                     max(dmax[k - 1][pre] * abilities[i], dmin[k - 1][pre] * abilities[i]))
                    dmin[k][i] = min(dmin[k][i], min(dmax[k - 1][pre] * abilities[i], dmin[k - 1][pre] * abilities[i]))
            res = max(res, dmax[selectedNum - 1][i])

        print(res)

第三关-完美的团建活动

“绿盟杯”决赛完美落幕之后,赛事团队组织去一个风景优美的山区进行团建。由于人数众多必须选择一块较大的场地。他们找到了一块足够大的地方,但是场地上却散布着许多石头,为了方便活动,必须把这些石头挪开。现在我们假设整个场地是一块矩形的地图,地图坐标的横纵坐标均为非负整数,每个坐标点上有一个值:

image.png
  1. 0:代表无法从这个点通过
  2. 1:代表这个点可以顺利通过
  3. N(大于1):代表这个点上有一个可以去除的石头,且石头的大小是N

</pre>

现在要求你按照以下规则移除石头:从当前位置出发,按石头的大小依次移除石头,每次先移除从当前位置出发能够达到的最小的石头,每移除一个石头,该石头所在坐标就可以通行即值变为1。你需要编写一个程序计算出从坐标(0,0)出发,移除所有石头需要走的最小步数,注意,石头是无法翻越的,而且如果(0,0)上有石头可以直接移除。如果无法移除所有的石头就输出-1。一个温馨的小提示仅供大家参考,大家注意哦:使用BFS算法再配以适合的数据结构如优先队列等是一个不错的选择!

编程要求

补全右侧代码区中的get_minium_steps(self, stones)函数,完成挑战任务中提出的要求,并将结果作为返回值返回:按照石头大小,从小到大依次移除场地中的石头,返回最小的步数,如果无法移除所有的石头就返回-1

函数参数说明如下:

stones表示场地中各个坐标点的情况(List < List <int> >类型)
List.get(0).get(0)代表坐标(0,0)),即0代表无法通过,1代表可以顺利通过,大于1的正数代表存在一个可以移除的石头,且石头的大小是该点的值。

测试说明

样例1:
输入:
1,2,3
0,0,4
7,6,5
输出:
6
样例2:
输入:
1,2,3
0,0,0
7,6,5
输出:
-1

官方解答:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
class TeamBuilding:
    def get_minium_steps(self, stones):

        # Add sentinels (a border of zeros) so we don't need index-checks later on.
        stones.append([0] * len(stones[0]))
        for row in stones:
            row.append(0)

        # Find the trees.
        trees = [(height, i, j)
                 for i, row in enumerate(stones)
                 for j, height in enumerate(row)
                 if height > 1]

        # Can we reach every tree? If not, return -1 right away.
        queue = [(0, 0)]
        reached = set()
        for i, j in queue:
            if (i, j) not in reached and stones[i][j]:
                reached.add((i, j))
                queue += (i+1, j), (i-1, j), (i, j+1), (i, j-1)
        if not all((i, j) in reached for (_, i, j) in trees):
            return -1

        # Distance from (i, j) to (I, J).
        def distance(i, j, I, J):
            now, soon = [(i, j)], []
            expanded = set()
            manhattan = abs(i - I) + abs(j - J)
            detours = 0
            while True:
                if not now:
                    now, soon = soon, []
                    detours += 1
                i, j = now.pop()
                if (i, j) == (I, J):
                    return manhattan + 2 * detours
                if (i, j) not in expanded:
                    expanded.add((i, j))
                    for i, j, closer in (i+1, j, i < I), (i-1, j, i > I), (i, j+1, j < J), (i, j-1, j > J):
                        if stones[i][j]:
                            (now if closer else soon).append((i, j))

        # Sum the distances from one tree to the next (sorted by height).
        trees.sort()
        return sum(distance(i, j, I, J) for (_, i, j), (_, I, J) in zip([(0, 0, 0)] + trees, trees))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351