“绿盟杯”决赛第二阶段(Python题解)

12 篇文章 0 订阅
5 篇文章 0 订阅

(一)生日蜡烛

挑战任务

参加“绿盟杯”决赛的小明同学从18岁之后的某一年开始每年都会在他家的别墅举办一次生日派对,在每一次办生日派对的时候都会有一个吹蜡烛的环节,小明都会吹灭与年龄相同数量的生日蜡烛。

你需要编写一个程序,根据总共吹灭的蜡烛数量,来判断小明同学现在多少岁了。

编程要求

补全右侧代码区中的birthdayCandle(num)函数,实现通过吹灭蜡烛的根数来判断小明的最小年龄功能。输出小明的年龄以及他从多少岁开始举办生日派对。函数参数说明如下:

num 总共吹灭的蜡烛数

测试说明

不会给出有两种解的测试用例。

样例1:
输入:
19

输出:
小明今年:19
小明从19岁开始每年举办派对

样例2:
输入:
236

输出:
小明今年:33
小明从26岁开始每年举办派对


开始你的任务吧,祝你成功!

class Task:
    def birthdayCandle(self,num):
        for i in range(18,num+1):
            start_num = i
            sum = 0
            for j in range(i,num+1):
                sum = sum + j
                if sum == num:
                    print("小明今年:",end='')
                    print(j,end='')
                    print("岁")
                    print("小明从",end='')
                    print(start_num,end='')
                    print("岁开始每年举办派对")
#这个题真的很有问题,因为如果不用return 0 的话可以算出很多组答案
                    return 0

(二)背包问题

挑战任务

小绿是“绿盟”的工程师,这次准备参加团队组织的团建,本次团建他要负责携带团队所有人的零食,小绿目前只有一个背包,现在总共有num袋零食,每袋零食的体积不一定相同;小绿现在想知道在零食的总体积不超过自己背包容量的情况下,总共可以有多少种放零食的方法(体积为0也是一种放法)。

编程要求

请在右侧编辑器中填充代码,补全函数getTheWay(num, bagCapacity,snacks),求出总共有多少种放零食的方法,将结果作为函数的返回值返回,函数参数含义如下:
num:表示零食共有多少袋
bagCapacity:表示背包的容量
snacks:表示零食的体积数组

测试说明:

输入包括两行
第一行输入两个整数
numbagCapacity(1 <= num <= 30, 1 <= bagCapacity <= 2 * 10^9),表示零食共有多少袋和背包的容量。
第二行为一个数组
snackssnacks[i](0 <= snacks[i] <= 10^9),表示每袋零食的体积。

样例1:

输入:
2 10
1 3

输出:
4

样例2:

输入:
3 3
1 3 5

输出:
3


开始挑战吧,祝你成功!

# # from scipy.special import comb, perm
#计算排列数目
class Max_count:
    def get_value(n):
        if n == 1:
            return n
        else:
            return n * Max_count.get_value(n - 1)
    def gen_last_value(n, m):
        first = Max_count.get_value(n)
        # print("n:%s     value:%s" % (n, first))
        second = Max_count.get_value(m)
        # print("n:%s     value:%s" % (m, second))
        third = Max_count.get_value((n - m))
        # print("n:%s     value:%s" % ((n - m), third))
        return first / (second * third)
    def max_count(n):
        count = 1
        for i in range(1, n):
            count = count + Max_count.gen_last_value(n, i)
        return count + 1
#输出所有的组合方式
class Combination:
    def combine(n, k):
        ans = []
        stack = []
        x = 1
        while True:
            len_stack = len(stack)
            if len_stack == k:
                # ans = stack
                ans.append(stack[:])
            if len_stack == k or x > n - k + len_stack + 1:
                if not stack:
                    return ans
                x = stack.pop() + 1
            else:
                stack.append(x)
                x += 1

class Task:
    def getTheWay(self,num,bagCapacity,snacks):
        count = 1
        max_count = Max_count.max_count(num)
        # print(max_count)
        an =[]
        for i in range(1,num+1):
            an += Combination.combine(num,i)
        # print(an)
        for j in range(len(an)):
            sub_sum = 0
            # print(an[j])
            for k in range(len(an[j])):
                xiabiao = an[j][k] - 1
                sub_sum += snacks[xiabiao]
            # print(sub_sum)
            if sub_sum <= bagCapacity:
                count += 1

        return count
#测试
a = Task()
#b = a.getTheWay(2,10,[1,3])
# b = a.getTheWay(3,3,[1,3,5])
b = a.getTheWay(21,1165911996,[842104736,130059605,359419358,682646280,378385685,622124412,740110626,814007758,557557315,40153082,542984016,274340808,991565332,765434204,225621097,350652062,714078666,381520025,613885618,64141537,783016950])
print(b)

(三)页岩气勘探

挑战任务

页岩气是指赋存于以富有机质页岩为主的储集岩系中的非常规天然气,是连续生成的生物化学成因气、热成因气或二者的混合,可以游离态存在于天然裂缝和孔隙中。
地质调查局负责检测地下的页岩气,有一次在一个大的矩形区域工作,并创建了一个网格,并将网格划分为多个地块。然后分别分析每个地块,使用传感设备确定该地块是否含有页岩气。含有页岩气的的部分被称为页岩块。如果两个页岩块相邻,则它们是同一个页岩气藏的一部分。页岩气藏可能相当大,可能含有大量的页岩块。你的工作是确定网格中包含多少个不同的页岩气藏。

编程要求

请在右侧编辑器中编写代码,补全getBlockNum(self,n, m, arr)函数,实现查找页岩气藏数量的功能,并将最终结果作为函数的返回值返回,函数参数说明如下:

n:矩形区域的行;
m:矩形区域的列;
arr:包含页岩气的矩形区域;

测试说明

下列输入的数据中,*代表什么也没有,字母x代表页岩快,一个页岩气藏不会超过100个页岩块。

样例1:

输入:
1 1
*
输出:
0

样例2:

输入:
3 5
* x * x *
* * x * *
* x * x *

输出:
1

样例3:

输入:
5 5
* * * * x
* x x * x
* x * * x
x x x * x
x x * * x

输出:
2


开始你的挑战吧,祝你成功!

def DFS(n,m,x,y,arr,arr_id):
    for i in range(-1,2):
        for j in range(-1,2):
            xx = x + i
            yy = y + j
            if (xx != x or yy != y):
                if (xx >= 0 and xx < n and yy >=0 and yy < m):
                    if (arr_id[xx][yy] == 0 and arr[xx][yy] == 'x'):
                        arr_id[xx][yy] = arr_id[x][y]
                        DFS(n,m,xx,yy,arr,arr_id)
    return arr_id

class Task:
    def getBlockNum(self,n,m,arr):
        count_id = 0
        result = 0
        arr_id = [[0 for i in range(len(arr[0]))] for j in range(len(arr))]
        # print(arr_id)
        for i in range(len(arr)):
            for j in range(len(arr[0])):
                if (arr[i][j] == 'x' and arr_id[i][j] == 0):
                    count_id += 1
                    arr_id[i][j] = count_id
                    DFS(n,m,i,j,arr,arr_id)
        # print(arr_id)
        arr_max = []
        for i in range(len(arr_id)):
            # print(max(arr_id[i]))
            arr_max.append(max(arr_id[i]))
        # print(max(arr_max))
        result = max(arr_max)
        return result
#测试
a = Task()
# b = a.getBlockNum(5,5,[['*','*','*','*','x'],['*','x','x','*','x'],['*','x','*','*','x'],['x','x','x','*','x'],['x','x','*','*','x']])
b = a.getBlockNum(6,5,[['*','x','*','x','*'],['*','x','x','*','*'],['x','x','*','x','*'],['*','*','*','*','*'],['x','x','*','x','*'],['*','x','*','x','x']])
# b = a.getBlockNum(3,5,[['*','x','*','x','*'],['*','*','x','*','*'],['*','x','*','x','*']])
print(b)

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值