蓝桥杯--数字三角形,内存空间!

题目:数字三角形

在这里插入图片描述

题目思路:观察发现,行数为奇数时,为了符合 左下走的次数与右下走的次数相等, 该路径最后一定是走到 行中间, 行数为偶数时,一定是最中间的两个进行比较大小即可。
map(function, iterable, …)为迭代器,不可计算它的长度,但可以进行list()转换,进而进行输出

N = int(input())
w = [list(map(int, input().split())) for i in range(N)] 

for i in range(1, N):
    for j in range(i+1):
        if j == 0: #最左边的数一定是右上的数进行相加
            w[i][j] += w[i-1][j]
        elif i == j: #最右边的数一定是左上的数进行相加
            w[i][j] += w[i-1][j-1]
        else: #其他进行 上一行比较最大值
            w[i][j] += max(w[i-1][j], w[i-1][j-1])

if N % 2 != 0:
    print(w[N-1][N//2])
else:
    print(max(w[N-1][N//2-1], w[N-1][N//2]))
    

题目: 内存空间

题目描述

小蓝最近总喜欢计算自己的代码中定义的变量占用了多少内存空间。

为了简化问题,变量的类型只有以下三种:

int:整型变量,一个 int 型变量占用 4 Byte 的内存空间。

long:长整型变量,一个 long 型变量占用 8 Byte 的内存空间。

String:字符串变量,占用空间和字符串长度有关,设字符串长度为 L,则字符串占用 L Byte 的内存空间,如果字符串长度为 0 则占用 0 Byte 的内存空间。

定义变量的语句只有两种形式,第一种形式为:

type var1=value1,var2=value2…;

定义了若干个 type 类型变量 var1、var2、…,并且用 value1、value2、…初始化。

多个变量之间用’,’ 分隔,语句以’;’ 结尾,type 可能是 int、long 或 String。例如 int a=1,b=5,c=6; 占用空间为 12 Byte;long a=1,b=5; 占用空间为 16 Byte;String s1=””,s2=”hello”,s3=”world”; 占用空间为 10 Byte。

第二种形式为:

type[] arr1=new type[size1],arr2=new type[size2]…;

定义了若干 type 类型的一维数组变量 arr1、arr2…,且数组的大小为 size1、size2…,多个变量之间用’,’ 进行分隔,语句以’;’ 结尾,type 只可能是 int 或 long。例如 int[] a1=new int[10]; 占用的内存空间为 40 Byte;long[] a1=new long[10],a2=new long[10]; 占用的内存空间为 160 Byte。

已知小蓝有 T 条定义变量的语句,请你帮他统计下一共占用了多少内存空间。结果的表示方式为:aGBbMBcKBdB,其中 a、b、c、d 为统计的结果,GB、MB、KB、B 为单位。优先用大的单位来表示,1GB=1024MB,1MB=1024KB,1KB=1024B,其中 B 表示 Byte。如果 a、b、c、d 中的某几个数字为 0,那么不必输出这几个数字及其单位。题目保证一行中只有一句定义变量的语句,且每条语句都满足题干中描述的定义格式,所有的变量名都是合法的且均不重复。题目中的数据很规整,和上述给出的例子类似,除了类型后面有一个空格,以及定义数组时 new 后面的一个空格之外,不会出现多余的空格。

输入格式
输入的第一行包含一个整数 T ,表示有 T 句变量定义的语句。

接下来 T 行,每行包含一句变量定义语句。

输出格式
输出一行包含一个字符串,表示所有语句所占用空间的总大小。
样例输入
1
long[] nums=new long[131072];
样例输出
1MB
提示
样例 1,占用的空间为 131072 × 8 = 1048576 B,换算过后正好是 1MB,其它三个单位 GB、KB、B 前面的数字都为 0 ,所以不用输出。

样例 2,占用的空间为 4 × 2 + 8 × 2 + 10 + 8 × 100000 × 2 B,换算后是 1MB538KB546B。

对于所有评测用例,1 ≤ T ≤ 10,每条变量定义语句的长度不会超过 1000 。所有的变量名称长度不会超过 10,且都由小写字母和数字组成。对于整型变量,初始化的值均是在其表示范围内的十进制整数,初始化的值不会是变量。对于 String 类型的变量,初始化的内容长度不会超过 50,且内容仅包含小写字母和数字,初始化的值不会是变量。对于数组类型变量,数组的长度为一个整数,范围为:[0, 230],数组的长度不会是变量。T 条语句定义的变量所占的内存空间总大小不会超过 1 GB,且大于 0 B。

题目要求:该题考察对字符串的操作,若会利用正则表达式,这道题应该更简单。难点在于考察String,int【】,long【】,怎么才能取到他们中括号里面的值或者引号里面的值?


# int a=1,b=5,c=4;
# String s2="hello",s3="world";
# int[] a1=new int[10],a2=new int[10];
# long[] a1=new long[10],a2=new long[10];
T = int(input())
B = 0
for _ in range(T):
    flag = False
    line = input().replace(';', '')
    # startswith str.startswith("suffix", start, end)
    # startswith 用于判断字符串中某段字符串是否以指定字符或子字符串结尾。
    # startswith 返回值为布尔类型(True,False).
    if line.startswith('int '):
        B = line.count('=') * 4
    if line.startswith('long '):
        B = line.count('=') * 8
    if line.startswith('String'):
        for char in line:
            if char == '\"' or char == '“':  # \为转义字符识别英文的"
                flag = not flag
            if flag and char != '\"' and char != '“':
                B += 1
    if line.startswith('int[]'):
        line = line.replace('int[]', '')
        line_list = line.split(',')
        for i in line_list:
            num_str = ''
            flag_2 = False
            for char in i:
                if char == '[':
                    flag_2 = True
                if flag_2:
                    num_str += char
                if char == ']':
                    break
            B += int(num_str[1:-1]) * 4  # [1:-1]为取中括号里面的值,num_str的值为[_]
    if line.startswith('long[]'):
        line = line.replace('long[]', '')
        line_list = line.split(',')
        for i in line_list:
            num_str = ''
            flag_3 = False
            for char in i:
                if char == '[':
                    flag_3 = True
                if flag_3:
                    num_str += char
                if char == ']':
                    break
            B += int(num_str[1:-1]) * 8

GB = B // 1024 // 1024 // 1024  # 注意为什么这里最后要用//, 而不是%
MB = B // 1024 // 1024 % 1024
KB = B // 1024 % 1024
b = B % 1024

if GB != 0:
    print(GB, end='')
    print('GB', end='')
if MB != 0:
    print(MB, end='')
    print('MB', end='')
if KB != 0:
    print(KB, end='')
    print('KB', end='')
if b != 0:
    print(b, end='')
    print('B', end='')

本文题解皆有借鉴他人之处,供自己及大家学习,如有侵权,请联系删除!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值