//递推公式,感觉和之前学习的那个三角形很像啊
#include <stdio.h>
double dp[11][11];//静态数组赋0
int main(){
int n,t,count=1;//第一个杯子是1
scanf("%d%d",&n,&t);
dp[1][1]=t;
for(int i=2;i<=n;i++) {//因为第一层已经赋值了,从第二层开始
for(int j=1;j<=i;j++){
if(dp[i-1][j]>1)
dp[i][j]+=(dp[i-1][j]-1)/2;
if(dp[i-1][j-1]>1)
dp[i][j]+=(dp[i-1][j-1]-1)/2;
if(dp[i][j]>=1)
count++;
}
}
/* if(t==0)
printf("0\n");
else
printf("%d\n",count);*/
printf("%d\n",t==0?0:count);//一个很有趣的写法
return 0;
}
一个要找规律的递推公式,首先把杯子假设无限大,把t灌进去然后再一步步推,每个杯子都有两个父亲,一个是【i-1】【j】一个是【i-1】【j-1】。
把两个父亲除以二,但是因为涉及除法所以dp数组要用double。
一开始忘了考虑t为0的情况导致测试点7出错。
在网上看到了一个把输出简化的方法,感觉选择表达式没怎么用过