Nowcoder/ByteCamp 20190601

## 立方体塔

题目描述

小方有w个白色立方体和b个黑色立方体,现在小方想把它们堆成一个立方体塔。

一座高度为h的立方体塔,最底层有h个立方体,每往上一层,所需立方体减一,直到最高层,只需要1个立方体。

为了让这座塔看起来比较美观,小方希望,每一层都只能用一种颜色的立方体。小方希望把这座塔叠得尽可能高,因此他想知道,塔的最大高度是多少,以及这个高度的立方体塔能有几种。

  • 输入描述
包含两个数字,w、b,代表有白色立方体w个、黑色立方体b个。
对于10%的数据: 0 <= w,b <= 200
对于20%的数据: 0 <= w,b <= 5000
对于100%的数据: 0 <= w,b <= 10^5
数据保证w+b >= 1
  • 输出描述
包含两个数字,h、c,代表塔最高高度为h,有c种不同的此高度的塔。
由于塔的种类有可能很多,请将塔的种类数c对1000000007(10^9+7)取模。
  • 示例1

    • 输入
    1 1
    
    • 输出
    1 2
    
  • 示例2

    • 输入
    4 6
    
    • 输出
    4 2
    
    • 说明
    两组高度为4的塔的颜色从底到顶分别为:白黑黑黑,黑白黑白。
    

待续

import sys


def cube_tower(white, black):
    high = 0
    seen = set()
    while True:
        current = ''
        for nu in range(15, 0, -1):
            if nu > white and nu > black:
                continue
            if nu <= white:
                white -= nu
                current += 'w'
                continue
            if nu <= black:
                black -= nu
                current += 'b'
                continue
        if len(current) > high:
            seen.clear()
            high = len(current)
            seen.add(current)
        elif len(current) == high:
            seen.add(current)
        break
    return high, len(seen), seen


if __name__ == '__main__':
    white, black = None, None
    for line in sys.stdin:
        white, black = map(int, line.strip().split())
        break

    print(cube_tower(white, black))

变量名拆分

题目描述

有一天小赵正在愉快的敲代码,小钱说:小赵,你这个变量的名字取的可读性不行啊,我都不知道哪里到哪里代表什么意思。小赵不服气的说:那你给我一组变量名,我保证我的变量名可以拆开,而且拆开的每一个变量名都在你这组变量名中出现。现在小钱提供了一组不含重复变量名的列表,你能判断小赵的变量名是否能够拆分为多个小钱提供的变量名吗,能则输出True,不能则输出False。

说明:可以重复使用小钱提供的变量名,输入变量名长度均不超过10000,变量名个数不超过10000。

  • 输入描述
第一行输入待拆分的变量名,第二行输入多个变量名,以空格隔开
  • 输出描述
根据能不能拆分输出True或者False
  • 示例1

    • 输入
    thisisadog
    this thisis is a dog
    
    • 输出
    True
    

集合消除相同元素

import sys


def variable_split(sentence, seq):
    seen, num = set(), len(sentence)
    while True:
        if len(seen) == len(seq):
            break
        current, variables = '', set()
        idx = 0
        for su in seq:
            if su in seen:
                if idx == 0:
                    continue
                if su in sentence[idx:] and sentence.index(su, idx) != idx:
                    continue
            try:
                idx = sentence.index(su, idx) + len(su)
                current += su
                variables.add(su)
            except ValueError:
                continue
            if idx == num:
                seen.update(variables)
                break
        else:
            return False
    return True


if __name__ == '__main__':
    input_content = []
    for line in sys.stdin:
        input_content.append(line.strip())
        if len(input_content) == 2:
            break

    sentence = input_content[0]
    variable_name = input_content[1].split()

    print(variable_split(sentence, variable_name))

(最近更新:2019年06月16日)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值