版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41505957/article/details/85083828
http://acm.zzuli.edu.cn/problem.php?id=2460
题目描述
俗语说,美酒虽好,不要贪杯哦。今天我们的小博开始对美酒产生了兴趣,准确点说是倒酒:他拿来一堆酒杯,把他们摆成了金字塔形状,第一层一个,第二层两个,第三层三个。。。第n层n个,形状如图所示:
然后小博搬来很多箱箱82年的红酒(小博是位土豪),开始从金字塔顶层开始倒酒
已知每秒钟倒出的酒量正好能装满一杯,当一个酒杯注满酒后,酒就会顺着被子流下来,并均匀地分向下一层的两个酒杯。
如果最底层的酒杯注满了,酒会顺着杯子流到桌子上。为了方便起见,这里不考虑酒在流的过程中停留在杯沿的部分和挥发的部分,并假设酒的流速是足够快的。
现在,小博想知道,如果他在t秒后停止倒酒,金字塔中会有多少个已经被注满的酒杯?
输入
测试数据有多组,每个测试数据占一行
对于每组测试数据,一行两个整数 n 和 t (1≤n≤10,0≤t≤10000),分别表示金字塔n层 和 倒酒时间为t秒
输出
对于每组测试数据,输出t秒后处于满的状态的酒杯数量。输出占一行。
样例输入
3 5 3 7
样例输出
4 6
#include<stdio.h>
#include<string.h>
#define N 20
double a[N][N];
int main()
{
int n,i,j,t,ans;
while(scanf("%d%d",&n,&t)!=EOF)
{
memset(a,0,sizeof(a));
ans=0;
a[1][1]=t;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
{
a[i+1][j]+=(a[i][j]-1)/2.0;
a[i+1][j+1]+=(a[i][j]-1)/2.0;
}
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
if(a[i][j]>=1)
ans++;
printf("%d\n",ans);
}
return 0;
}