P8791 [蓝桥杯 2022 国 AC] 内存空间

题目描述

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

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

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 可能是 intlong 或 String。例如 int a=1,b=5,c=6; 占用空间为 1212 Byte;long a=1,b=5; 占用空间为 1616 Byte;String s1="",s2="hello",s3="world"; 占用空间为 1010 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。

已知小蓝有 TT 条定义变量的语句,请你帮他统计下一共占用了多少内存空间。结果的表示方式为: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

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";
long[] arr1=new long[100000],arr2=new long[100000];

输出 #2

1MB538KB546B

说明/提示

【样例说明】

样例 1,占用的空间为 131072×8=1048576 ,换算过后正好是 1MB,其它三个单位 GB、KB、B 前面的数字都为 0,所以不用输出。

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

【评测用例规模与约定】

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

蓝桥杯 2022 国赛 A 组 C 题(C 组 D 题)。

解题思路(小tips)

一道简单的模拟题  直接按照题目模拟 将int long 一组 string一组 分别计算 而对int和long又要分普通变量和数组两种 所以再加一种计算方法 三种不同的计算方法

若对于具体计算方法有疑问或者对代码任何部分有疑惑 都可以评论交流

AC代码展示

如果觉得有用 就点赞+收藏 鼓励一下吧

#include <bits/stdc++.h>
#define int long long
using namespace std;
string str;
int n,res,a[4];
string s[4]={"GB","MB","KB","B"};

int check1(int n){  //处理int和long型变量 
	int ans=0;
	for(int i=0;i<str.size();i++) if(str[i]=='=') ans+=n; 
	return ans;	
}
int check2(){ //处理字符串 
	int ans=0;
	for(int i=0;i<str.size();i++){
		if(str[i]=='"'){
			int j=i+1;
			while(j<str.size()&&str[j]!='"') ans++,j++;
			i=j;
		}
	} 
	return ans;
}
int check3(int n){ //处理int long 数组 
    int res=0;
	for(int i=0;i<str.size();i++){
		if(str[i]=='['){
			int j=i+1,ans=0;
			while(j<str.size()&&str[j]!=']'){
				if (isdigit(str[j]))  ans=ans*10+str[j]-'0';
				j++;
			} 
			i=j;
			res+=n*ans; 
		}
	}
	return res;
}

signed main(){
	cin>>n;
	getchar();
	while(n--){
		getline(cin,str);
		//直接根据不同情况模拟 
		if(str[0]=='i'){
			if(str[3]=='[') res+=check3(4);
			else res+=check1(4);
		}
		else if(str[0]=='l'){
			if(str[4]=='[') res+=check3(8);
			else res+=check1(8);
		}
		else res+=check2();
	}
	
	int num=4; //因为处理要倒着处理 所以先存起来 最后输出 
	while(num){
		a[--num]=res%1024;
		res=res/1024;
	}
	for(int i=0;i<4;i++)
		if(a[i]) cout<<a[i]<<s[i];
	
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值