1 条题解

  • 0
    @ 2025-8-24 22:42:30

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Grow_
    AFO.

    搬运于2025-08-24 22:42:30,当前版本为作者最后更新于2022-11-24 15:33:52,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题意

    给出 nn 条定义变量语句,问这些变量所占的空间。

    题解

    首先,因为输入可能含空格,所以我们要使用 getline 输入,不能用 cin!!!(我就被坑了)

    其次,因为 intlong longstring 的首字母不同,所以我们可以根据首字母判断变量的类型。

    知道了变量类型,我们就可以判断他是否为数组了,因为题目规定定义数组一定会在变量类型后面加上一对中括号,所以我们只需要判断变量类型后面有没有中括号就行了。

    因为字符串只要统计长度就行了,所以就不讲了。至于变量和数组,也还是比较好处理的。

    如果是变量的话,只要统计逗号的数量,计算时把数量加一再乘以所占内存就行了就行了。

    如果是数组的话的话,就需要算出每个数组的元素个数,这件事其实也比较简单,可以把数字串提取出来,再用一个函数来把这个字符串转为整型变量,再乘上一个所占的内存就可以了。

    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愉快!

    • 1

    信息

    ID
    7968
    时间
    1000ms
    内存
    128MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者