内存空间 题解
题意
给出
题解
首先,因为输入可能含空格,所以我们要使用 getline 输入,不能用 cin!!!(我就被坑了)
其次,因为 int、long long、string 的首字母不同,所以我们可以根据首字母判断变量的类型。
知道了变量类型,我们就可以判断他是否为数组了,因为题目规定定义数组一定会在变量类型后面加上一对中括号,所以我们只需要判断变量类型后面有没有中括号就行了。
因为字符串只要统计长度就行了,所以就不讲了。至于变量和数组,也还是比较好处理的。
如果是变量的话,只要统计逗号的数量,计算时把数量加一再乘以所占内存就行了就行了。
如果是数组的话的话,就需要算出每个数组的元素个数,这件事其实也比较简单,可以把数字串提取出来,再用一个函数来把这个字符串转为整型变量,再乘上一个所占的内存就可以了。
AC Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
int nc(string s){//string转int
int po=0;
for(int i = 0;i<s.size();i++){
po=po*10+(s[i]-'0');
}
return po;
}
signed main(){
int n,cnt=0;//定义cnt来统计内存
string s;
cin >> n;
n++;
for(int i = 1;i<=n;i++){
getline(cin,s);//可能含空格,使用getline
if(s[0]=='i'){//计算int
int c=0;//c表示这一个数组所占的内存
int f=s.find('[');//判断数组
if(f==-1){
for(int i = 0;i<s.size();i++){
if(s[i]==',')c+=4;//统计逗号数量
}
cnt+=c+4;//加上内存大小
}
else{
int r=0,l=s.find('[',r+1),p;//寻找第一个
r=s.find(']',l+1);
while(l!=-1){
string s2=s.substr(l+1,r-l-1);//提取子串
p=nc(s2);//转int
cnt+=p*4;//计算内存大小
l=s.find('[',r+1);
r=s.find(']',l+1);
//寻找下一个
}
}
}
else if(s[0]=='l'){//判断long long
int f=s.find('[');
if(f==-1){//判断数组
int c=0;//c表示这一个数组所占的内存
for(int i = 0;i<s.size();i++){
if(s[i]==',')c+=8;//统计逗号数量
}
cnt+=c+8;//加上内存大小
}
else{
int r=0,l=s.find('[',r+1),p;//寻找第一个
r=s.find(']',l+1);
while(l!=-1){
string s2=s.substr(l+1,r-l-1);//提取子串
p=nc(s2);//转int
cnt+=p*8;//计算内存大小
l=s.find('[',r+1);
r=s.find(']',l+1);
//寻找下一个
}
}
}
else{//判断string
int r=0,l=s.find('"',r+1),p;
r=s.find('"',l+1);
while(l!=-1){
string s2=s.substr(l+1,r-l-1);//提取子串
cnt+=s2.size();//加上子串长度
l=s.find('"',r+1);
r=s.find('"',l+1);
//寻找下一个
}
}
}
if(cnt>=1073741824){
cout << cnt/(1073741824) << "GB";
cnt%=(1073741824);
}
if(cnt>=1024*1024){
cout << cnt/(1024*1024) << "MB";
cnt%=(1024*1024);
}
if(cnt>=1024){
cout << cnt/1024 << "KB";
cnt%=1024;
}
if(cnt>0)cout << cnt << "B";
//输出答案
return 0;
}
最后,祝大家AC愉快!