CodeForces解题报告——1

这篇博客是作者的Codeforces解题报告,详细介绍了三个问题的解题思路和代码实现。题目1A涉及如何计算用a*a正方形瓷砖铺满n*m矩形的最少数量;题目1B探讨了在不同坐标系统之间转换的方法,特别是如何将数字转换为Excel格式的坐标;题目1C未提供具体题意和解法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Codeforces解题报告

——序号1

题目1A: Theatre Square

题意:

在一个n*m的矩形块里面用,a*a 的正方形瓷砖铺满它,问最少个数?

只需要计算边界上,最多需要的数量,然后相乘就好!

代码:

int main()
{
#ifdef LOCAL
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
#endif // LOCAL
    LL n, m ,a;
    while(cin >> n >> m >> a)
    {
        LL width = n / a + ((n % a == 0) ? 0 : 1);
        LL height = m / a + ((m % a == 0) ? 0 : 1);
        cout << width * height << endl;
    }
    return 0;
}

题目1B:Spreadsheets

题意:

在两种坐标中进行转换,一种是R*C*类型,一种是Excel表格的形式

已知在RXCY和AA11这两个坐标形式中,R型坐标Y是不用转换的直接就是Excel表格中的行数。

把一个数字转换为大写字母的基本方式是:

反复让sum和26求余数,如果余数不为0,则对应的字母为'A' - 1 + 余数,否则直接等于’Z'

然后sum = sum / 26; 但是如果余数为零,sum除以26以后,还需要减一 这是关键!!!

最后将所得字符反向输出即可!

比如28  -> 28 % 26 = 2 --> B

                 28 / 26 = 1

                1 % 26 = 1 --> A

输出结果为AB

把大写字母转换为数字的方法为:

参考二进制转换十进制 x1 * 2 ^ k + ...... + xn * 2 ^ 0;

即x * 26 ^ k + .......

其中x为字母的下表,A为1,k表示字母所在的位置,从0计数

比如 AB  就是  1*26^1 + 2 = 28

代码:

const int maxn = 100;
char cmd[maxn];
int Pow[] = { 1, 26, 676, 17576, 456976, 11881376 };
int pow2[] = { 1, 10, 100, 1000, 10000, 100000, 1000000 };

void fun1()
{
	int k = 0;
	int sum = 0;
	int pos = 0;
	int len = strlen(cmd);
	for (int i = len - 1; i >= 0; --i)
		if (isdigit(cmd[i]))
			sum += (cmd[i] - '0') * pow2[k++];
		else
			break;
	char tmp[maxn];
	int s = 0;
	 while (sum)
	{
		if (sum % 26 == 0)
		{
			tmp[s++] = 'Z';
			sum = sum / 26 - 1;
		}
		else
		{
			tmp[s++] = 'A' - 1 + sum % 26;
			sum /= 26;
		}
	}
	for (int i = s - 1; i >= 0; --i)
		printf("%c", tmp[i]);
	for (int i = 1; i < len; ++i)
		if (isdigit(cmd[i]))
			printf("%c", cmd[i]);
		else
			break;
	printf("\n");
}

void fun2()
{
	int len = strlen(cmd);
	int sum = 0;
	int pos = 0;
	printf("R");
	for (int i = 0; i < len; ++i)
		if (isdigit(cmd[i]))
			printf("%c", cmd[i]);
	printf("C");
	int k = 0;
	for (int i = len - 1; i >= 0; --i)
		if (isalpha(cmd[i]))
			sum += (cmd[i] - 'A' + 1) * Pow[k++];
	printf("%d\n", sum);
}

int main()
{
#ifdef LOCAL
	// freopen("in.txt", "r", stdin);
	// freopen("out.txt", "w", stdout);
#endif // LOCAL
	int n;

	scanf("%d", &n);
	while (n--)
	{
		scanf("%s", cmd);
		int len = strlen(cmd);
		bool flag = false;

		for (int i = 1; i < len; ++i)
			if (cmd[i] == 'C')
				flag = true;

		if (len >= 4 && cmd[0] == 'R' && isdigit(cmd[1]) && flag)
			fun1();
		else
			fun2();
	}
	return 0;
}


题目1C:Ancient Berland Circus

题意:
代码:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gscsdlz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值