1 搬砖 (1s)

搬砖 (1s)

方方和正正两个小朋友正在搬砖盖房子。他们有两种类型的砖头:红色和蓝色。每种砖头高度相同。一栋房子是用砖头一块一块地摞起来的。一块砖必须放在地上或者放在不同颜色的砖的上方(就是相同颜色的砖不能相邻)。 一栋楼至少要有1块砖,房子的高度等于建造它的所有的砖的高度的和。两栋房子如果高度不同才认为它们不同(尽管有时候不同的配置会得到相同的高度)。求方方和正正能建多少种不同的房子。

输入:

第一行只有1个正整数,是数据组数(小于150组)。

之后每组数据一行,用空格隔开的4个数,每个输入的数是[1, 474747474]中的整数。

分别表示红砖个数,每块红砖的高度,蓝砖个数,每块蓝砖的高度。

输出:

每组数据输出一行。所有不同房子的个数。

样例输入:

2

1 2 3 4

4 4 4 7

样例输出:

4

12

解析:

根据大神的讲解一下子豁然开朗了,

首先分析一下题目要求:

1,颜色要求:有两种颜色的砖块,必须要交替重叠,即使一种颜色多于另一种颜色很多也是无用,最终只是多出来的一块有用而已。

2.高度要求:叠成后不同高度的表示形成不同种类,一栋楼必须有一块砖。

其次:

 分析一下思路:

就是求组合数:

借鉴一下渊神的想法吧:设min为个数较少的那个数,ans为组合数;

其一:当两种砖块厚度一相同时的前提下:1.个数相同时:因为总是交替叠放,最终总高度为2*min,这时对于高度不均的因素可忽略,故而,就是一层一层叠放,形成高度分别为1.......2*min,故:ans=2*min;

 2:个数不同时:前面说过,由于只有交替重叠才有效果,故而只有多出的那一块放在异色上面有用,故:ans=2*min+1;

其二:当两种砖厚度不一样的前提下:1,个数相同时,由于存在厚度差异,故而最终形成两列:一个以红色为底,一个以黑色为底,但是我们发现当叠的个数是偶数个时。两列高度一定相同这是很显然的!因此只要把偶数的筛选出(min+min)/2即可,故: ans=2* min-(min+min)/2;

2;个数不同时,由于多出的一个有用,故:ans=2*min-(min+min)/2+1;

完毕:一旦适当的分类讨论,一切问题的答案都会付出水面的

且看代码AC

#include<stdio.h>

int main()

{

freopen("in1.txt","r",stdin);

freopen("out1.txt","w",stdout);

int t,min,ans;

int r,rs,b,bs;

scanf("%d",&t);

while(t--) 

 {

 scanf("%d%d%d%d",&r,&rs,&b,&bs);

  min=r<=b? r:b;

  if(rs==bs)

   {

    ans=2*min;

    if(r!=b)

    ans++;

   }

   else

   {

   ans=4*min-(min+min)/2;

   if(r!=b)

   ans++;

   }

   printf("%d\n",ans);

 }

 return 0;

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值