NBU 1763

来源:互联网 发布:安装java linux 编辑:程序博客网 时间:2024/05/17 04:49

官方题解还没放出,这里放上我自己的代码仅供参考。
递推公式很简单,观察样例可以得出
A[i][j]=(A[i-1][j-1]+A[i-1][j])/2),但,题目中要求每个数都保留前八位小数,这里的保留前八位并不是指在输出时保留八位小数,而是在运算过程中保留,即递推计算出每个值我们只能取八位小数。
如果直接用double存储值,在输出时截取八位小数会出现误差,input中有数据专门卡这一点。
运算得出结果时,将double值乘1e8转成long long长整型,再除1e8,即可截取运算结果的前八位。

#include <iostream>#include <cstdio>#include <cstring>#define LL long longusing namespace std;const LL mod=1e9+7;const int maxr=1e2+5;const int maxc=15;double v[maxr][maxc];int main(){    int t, m;    double n;    scanf("%d", &t);    for(int cas=1; cas<=t;cas++){        scanf("%lf%d",&n, &m);        for(int i=1;i<maxr;i++) for(int j=0;j<maxc;j++) v[i][j]=0;        printf("Case %d:\n", cas);        v[1][1]=n*1.0;        printf("%.8lf\n", v[1][1]);        if(1<m) puts("");        for(int i=2;i<=m;i++){            for(int j=1;j<=i;j++){                v[i][j]=(v[i-1][j-1]+v[i-1][j])/2;                LL x=v[i][j]*1e8;                printf("%.8lf%c", x*1.0/1e8, j==i?'\n':' ');            }            if(i<m) puts("");        }        if(cas<t) printf("\n\n");    }    return 0;}
原创粉丝点击