首页 > 系统相关 >P8791 [蓝桥杯 2022 国 AC] 内存空间 题解

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

时间:2024-04-10 21:58:13浏览次数:39  
标签:KB AC MB int 题解 long 蓝桥 kkk 1024

题面

一道比较简单模拟题,但是要分类讨论

一.读完题你应该知道的

1.输入一共有 T + 1 行,输入含有空格。(处理1)

2.对于每一行变量定义的语句,只会出现一种变量类型,type 只可能是 intlong ,只有一个分号。(处理1,处理2)

3.统计内存过程中用 B 做单位,保证一定有输出,但在输出时要换算。(比如1024B就要换算成1KB)(处理3)

4.即使用 intlong 定义的 a = 0 也会占用空间。(处理2)


二.解法 (不就是模拟吗)

处理1

通过题目和样例可以看出,接下来的T行,每次定义都会先声明本行的变量类型(这一部分不含空格,且后面会紧接着一个空格),包括 intint[]longlong[]String (注意这里的S是大写)。

因此 , 可以先定义一个 string s ,然后 cin >> s ,只记录下这一行所声明的变量,然后再分类讨论做处理。


处理2

处理2.0

完成处理1后,后面还有一长串需要输入,这时候对于 int[]long[]String 就需要用 getline 来输入,从样例可以看出,不保证没有空格,所以用 getline 保险起见。(其实不用就会WA)

而对于 intlong 类型,题目保证没有多余的空格,用的人都知道,只需要 cin >> s 就够了。

2.1对于 intlong 类型

对于这种类型,可以发现,它们定义时一定是形如a=b的形式,当有多个这样的形式存在时用逗号隔开,结尾以分号结束。只需要遍历一遍整个字符串,并统计其中 "=" 出现的次数即可,由于这里只是定义了一个变量,总值只需要加上 4B (int 类型) 或 8B ( long 类型) 就行了。

2.2对于 int[]long[] 类型

遍历声明了 int[] 类型或 long[] 类型的这一行时,定义一个标记变量\(l\),来标记所遇到的 [ 的下一个位置,也就是 [ 右边的第一个数字,当遇到 ] 时,说明这一个数组定义已经完成,再从 l 开始到 i - 1 的位置进行遍历,将数组大小\(k\)取出来,最后总值加上 k * 4 ( int 类型) 或 k * 8 ( long 类型) 即可。

2.3对于 String 类型

跟上面的差不多,但是英文输入中的双引号长得是一样的,在遍历声明了 String 类型的这一行时,先定义标记变量 flag 来标记在第 j 个位置第 i (此时 i 为奇数) 次遇到的 "后一个位置,也就是第 j + 1 个位置,在第 i + 1 次遇到 " 时,用当前的位置 j ,即 j 减去 flag ,也就是 j - flag ,得出的结果 k 就是这一段字符串的长度。字符串中每个字符只占用 1B ,最后总值加上 k 即可。

对于整个处理2,其实可以用函数模块化解决,代码量会大大缩减。


处理3

考虑题目内存所占空间是( 0B1024GB ),即( 0B1,099,511,627,776B ),用 int 来存一定会炸,所以这里用 long long 定义 4 个变量 GBMBKBB 进行储存。并且在每一行的操作结束后,都对这 4 个变量进行及时的维护。(其实好像没有必要,在最后维护一次就够了)


最后贴上我码风奇特的代码:

#include<bits/stdc++.h>
#define ll long long
#define maxx 1000100
#define fr(i , a , b) for(ll i = a ; i <= b ; ++i)
#define fo(i , a , b) for(ll i = a ; i >= b ; --i)
using namespace std;
inline ll read()
{
	ll k = 0 , f = 0;
	char c = getchar();
	for( ; !isdigit(c) ; c = getchar())
	{
		f |= c == '-';
	}
	for( ; isdigit(c) ; c = getchar())
	{
		k = (k << 1) + (k << 3) + (c ^ 48);
	}
	return f ? -k : k;
}
ll T , GB , MB , KB , B;
string s;
signed main()
{
	T = read();
	while(T--)
	{
		cin >> s;
		if(s == "int")
		{	
//			getline(cin , s);
			cin >> s;
			ll kkk = 0;
			fr(i , 0 , s.size() - 1)
			{
				if(s[i] == '=')
				{
					kkk++;
				}
			}
			B += kkk * 4;
			KB += B / 1024;
			B %= 1024;
			MB += KB / 1024;
			KB %= 1024;
			GB += MB / 1024;
			MB %= 1024;
		}
		else if(s == "int[]")
		{
			getline(cin , s);
			ll l;
			fr(i , 0 , s.size() - 1)
			{
				if(s[i] == '[')
				{
					l = i + 1;
				}
				else if(s[i] == ']')
				{
					ll kkk = 0;
					fr(j , l , i - 1)
					{
						kkk = kkk * 10 + (s[j] - '0');
					}
					B += kkk * 4;
				}
			}
			KB += B / 1024;
			B %= 1024;
			MB += KB / 1024;
			KB %= 1024;
			GB += MB / 1024;
			MB %= 1024;
		}
		else if(s == "long")
		{
//			getline(cin , s);
			cin >> s;
			ll kkk = 0;
			fr(i , 0 , s.size() - 1)
			{
				if(s[i] == '=')
				{
					kkk++;
				}
			}
			B += kkk * 8;
			KB += B / 1024;
			B %= 1024;
			MB += KB / 1024;
			KB %= 1024;
			GB += MB / 1024;
			MB %= 1024;
		}
		else if(s == "long[]")
		{
			getline(cin , s);
			ll l;
			fr(i , 0 , s.size() - 1)
			{
				if(s[i] == '[')
				{
					l = i + 1;
				}
				else if(s[i] == ']')
				{
					ll kkk = 0;
					fr(j , l , i - 1)
					{
						kkk = kkk * 10 + (s[j] - '0');
					}
					B += kkk * 8;
				}
			}
			KB += B / 1024;
			B %= 1024;
			MB += KB / 1024;
			KB %= 1024;
			GB += MB / 1024;
			MB %= 1024;
		}
		else
		{
			ll flag = -1;
			cin >> s;
			fr(i , 0 , s.size() - 1)
			{
				if(s[i] == '"' && flag == -1)
				{
					flag = i + 1;
					continue;
				}
				if(s[i] == '"' && flag != -1)
				{
					B += i - flag;
					flag = -1;
				} 
			}
			KB += B / 1024;
			B %= 1024;
			MB += KB / 1024;
			KB %= 1024;
			GB += MB / 1024;
			MB %= 1024;
		}
	}
	if(GB != 0)
	{
		printf("%lldGB" , GB);
	}
	if(MB != 0)
	{
		printf("%lldMB" , MB);
	}
	if(KB != 0)
	{
		printf("%lldKB" , KB);
	}
	if(B != 0)
	{
		printf("%lldB" , B);
	}
	return 0;
}

标签:KB,AC,MB,int,题解,long,蓝桥,kkk,1024
From: https://www.cnblogs.com/xhqdmmz/p/18127562

相关文章

  • CF1681C Double Sort 题解
    一道普及-我写了两个半小时题面。需要注意的是,每次交换需要将a和b两个数组同时交换,因此便可以想到唯一可行情况:a,b序列数字间的大小关系必须一致。举个例子2462131317970612在上面的例子中,两个序列中任意\(i\)和\(j\)满足\(a_i\lea_j\)时\(b_i......
  • P8779 [蓝桥杯 2022 省 A] 推导部分和
    并查集板子题#include<bits/stdc++.h>#defineR(x)x=read()#defineRLL(x)x=readLL()usingnamespacestd;typedeflonglongLL;constintN=1e5+5;inlineintread(){intx=0,f=1;charch=getchar();while(ch<'0'|......
  • CF958F1 Lightsabers (easy) 题解
    题面。不好意思,当我看到\(1\len\le100\),\(1\lem\len\)的那一刻,我承认我心动了。题目没翻译,用翻译软件翻译了才看懂。思路依据题意直接模拟即可。这里我用了三层循环来模拟。第一层为\(len\),表示长度;第二层为\(from\),表示出发点,此时需要遍历的区间的终点\(to=from......
  • CF1040B Shashlik Cooking 题解
    题面。看到这道题的第一眼,就想到用分块思想来解决。思路我们知道,当对任意一个\(i\)进行翻转时,区间\([i-k,i+k]\)内的所有元素都会翻转,每次翻转的总个数为\(2\timesk+1\)。因此,我们可以将所有烤串分成长度为\(len=2\timesk+1\)的\(block=n\divlen\)块,用数组\(L......
  • CF158C Cd and pwd commands 题解
    题面。大模拟,但是有坑点。思路依照题意模拟。用一个字符串\(out\)记录在进行了\(i\)次操作后如果要输出输出的东西,字符串\(in\)和\(s\)来分别记录输入的操作及操作类型。由于输出的第一个字符一定是/,所以可以直接将\(out\)的初始化定为out="/"。这样子可以省去......
  • CF875B Sorting the Coins 题解
    题面。算是比较简单的题目了,自己多手出几个样例就可以发现规律了。强烈建议多读几遍题目!!!!思路设0表示硬币朝上,1表示硬币朝下,则第\(0\)次与第\(n\)操作一定输出\(1\)。因为没有可以操作的对象,前者是由于全部硬币朝上,后者是由于全部硬币朝下,即使没有操作也要遍历一遍。注......
  • Oracle 替代变量
    替代变量说明在Oracle命令行中默认&为替代变量,只要在执行的sql中出现&符号,那么&符号后面的sql则会失效;这就意味着,包含&符号的sql将不会正确的执行比如:insertintoXXX_DB.XXX_TABLE(COLUMN1,COLUMN2)value('AB&CD','EF&GH');在不关闭替代变量的情况下,数据库中的数据将不会......
  • CF121A Lucky Sum 题解
    题面。不好意思,又双把通过率拉低了。在CF上交了22次才过。这里给出不同的写法。思路规律其他题解写得都很好,这里不需要再讲述如何推出规律。预处理出前\(5000\)个符合要求的数(其实我也不知道处理多少个刚好够,就随便写了一个数)。接下来借用到一点分块思想,将整个\([l,r]\)......
  • CF1670B Dorms War 题解
    题面。不好意思,把这道题的通过率拉低了,但坑点确实有。思路多出几个数据,我们可以发现,在不报警的前提下,最多可以操作数量是两个特殊字符间的最长距离。解释对于不报警的定义是:每次删除操作进行前,当前的字符串中的所有特殊字符的前一个位置必须不是特殊字符。换句话说,只要当前......
  • CF1817A Almost Increasing Subsequence 题解
    题面。2023.5.18修正关于前缀和数组的说法,与代码适配的思路。题意给定长度为\(n\)一个序列\(a\)以及\(q\)次询问,每次询问给出\(l\)和\(r\),要求找出序列\(a\)在\([l,r]\)内最长的几乎递增子序列。对于几乎递增的定义:如果一个序列中不存在连续的三个数\(x\),\(y\)......