CF626C Block Towers

CF626C Block Towers 题面

写完发现这题题解里没有我的做法,感觉这个做法更简单实用,故分享给大家。

分析

因为每个人的塔的高度要不相同,假设只有 2 层 2 层往上搭的话,那么很显然每个人只要都比前面的人多搭 2 层即可,所以n个人搭的高度为 2 * n 。

只有 3 层往上搭的同理,高度为 3 * m。

我们记 n 个 2 层 2 层往上搭的人的总高度为 sum1 , m 个 3 层 3 层往上搭的人的总高度为 sum2 。

所以一开始我们先令 sum1 = 2 * n , sum2 = 3 * m。

而本题同时有 2 层搭的和 3 层搭的,此时我们注意到,当第三个搭 2 层的人和第二个搭3层的人的高度均为 6 。

所以此时,我们应该把其中一个人让他再叠 2 层或 3 层使两人高度不再重合。

而当一个人又叠了一次之后,他之后的所有人都得往上再叠一次,所以可以理解为 sum1 的值增加了 2 或者 sum2 的值增加了 3。为了使结果最小,我们当然会增加当前值较小的一个使总结果更小。

而当层数是 6 的倍数时,就会有这样的一次重合,本题数据告诉我们可以暴力枚举。

本题的答案为 min ( sum1 , sum2 ) 。

参考代码

#include<bits/stdc++.h> 
using namespace std;
int n,m,sum1,sum2;
int main()
{
	scanf("%d%d",&n,&m);
	sum1=n*2;sum2=m*3;
	while(n>=3 && m>=2)
	{
		if(sum1+2<=sum2+3) sum1+=2,n++;   //注意这里我们把sum1的层数加了1次,所以要n++!
		else sum2+=3,m++;
		n-=3,m-=2;
	}
	printf("%d\n",max(sum1,sum2));
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值