1 搬砖 (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;
}