十三届蓝桥杯国赛 内存空间 python 满分答案

代码来源:b站  阿-岳同学
试题 D: 内存空间
时间限制 : 10.0s
内存限制 : 512.0MB
本题总分: 10
【问题描述】
小蓝最近总喜欢计算自己的代码中定义的变量占用了多少内存空间。
为了简化问题,变量的类型只有以下三种:
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
试题 D: 内存空间
6 第十三届蓝桥杯大赛软件赛决赛 Python 大学 B
Byte long[] a1=new long[10],a2=new long[10]; 占用的内存空间为
160 Byte
已知小蓝有 T 条定义变量的语句,请你帮他统计下一共占用了多少内
存空间。结果的表示方式为: a GB b MB c KB d B ,其中 a b c d 为统计的
结果, GB MB KB B 为单位。优先用大的单位来表示, 1 GB= 1024 MB
1 MB= 1024 KB 1 KB= 1024 B ,其中 B 表示 Byte 。如果 a b c d 中的某几个
数字为 0 ,那么不必输出这几个数字及其单位。题目保证一行中只有一句定义
变量的语句,且每条语句都满足题干中描述的定义格式,所有的变量名都是合
法的且均不重复。题目中的数据很规整,和上述给出的例子类似,除了类型后
面有一个空格,以及定义数组时 new 后面的一个空格之外,不会出现多余的空
格。
【输入格式】
输入的第一行包含一个整数 T ,表示有 T 句变量定义的语句。
接下来 T 行,每行包含一句变量定义语句。
【输出格式】
输出一行包含一个字符串,表示所有语句所占用空间的总大小。
【样例输入 1
1
long[] nums=new long[131072];
【样例输出 1
1MB
【样例输入 2
4
int a=0,b=0;
long x=0,y=0;
String s1=”hello”,s2=”world”;
试题 D: 内存空间
7 第十三届蓝桥杯大赛软件赛决赛 Python 大学 B
long[] arr1=new long[100000],arr2=new long[100000];
【样例输出 2
1MB538KB546B
【样例说明】
样例 1 ,占用的空间为 131072 × 8 = 1048576 B ,换算过后正好是 1 MB ,其
它三个单位 GB KB B 前面的数字都为 0 ,所以不用输出。
样例 2 ,占用的空间为 4 × 2 + 8 × 2 + 10 + 8 × 100000 × 2 B ,换算后是
1 MB 538 KB 546 B
【评测用例规模与约定】
对于所有评测用例, 1 T 10 ,每条变量定义语句的长度不会超过 1000
。所有的变量名称长度不会超过 10 ,且都由小写字母和数字组成。对于整型变
量,初始化的值均是在其表示范围内的十进制整数,初始化的值不会是变量。
对于 String 类型的变量,初始化的内容长度不会超过 50 ,且内容仅包含小写
字母和数字,初始化的值不会是变量。对于数组类型变量,数组的长度为一个
整数,范围为: [0 , 2 30 ] ,数组的长度不会是变量。 T 条语句定义的变量所占的内
存空间总大小不会超过 1 GB ,且大于 0 B
# -*- encoding: utf-8 -*-

def main():
    T = int(input())
    B = 0
    for _ in range(T):
        line = input()
        line = line.replace(";", "")

        if line.startswith("int[] "):
            line = line.replace("int[] ", "")
            statement = line.split(",")
            for state in statement:
                numberStr = ""
                flat = False
                for char in state:
                    if flat:
                        numberStr += char
                    if char == "[":
                        flat = True
                    if char == "]":
                        break
                number = int(numberStr[:-1])
                B += number * 4

            ...
        if line.startswith("long[] "):
            line = line.replace("long[] ", "")
            statement = line.split(",")
            for state in statement:
                numberStr = ""
                flat = False
                for char in state:
                    if flat and char.isdigit():
                        numberStr += char
                    if char == "[":
                        flat = True
                    if char == "]":
                        break
                number = int(numberStr)
                B += number * 8
            ...
        if line.startswith("int "):
            B += line.count("=") * 4
        if line.startswith("long "):
            B += line.count("=") * 8
        if line.startswith("String "):
            # String s1="",s2="hello",s3="world";
            flag = False
            charNum = 0
            for char in line:
                if flag and char not in ["\"", "”"]:
                    charNum += 1
                if char in ["\"", "”"]:
                    flag = not flag
            B += charNum

    KB = B // 1024
    MB = KB // 1024
    GB = MB // 1024
    B %= 1024
    KB %= 1024
    MB %= 1024
    # print(GB, MB, KB, B)
    res = ""
    if GB:
        res += f"{GB}GB"
    if MB:
        res += f"{MB}MB"
    if KB:
        res += f"{KB}KB"
    if B:
        res += f"{B}B"
    print(res)
    return None


if __name__ == "__main__":
    main()

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值