蓝桥杯 java 承压计算

题目:

思路:


1:其中的数字代表金属块的重量(计量单位较大) ==说明每个数字后面不一定有多少个0
2:假设每块原料的重量都十分精确地平均落在下方的两个金属块上,最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。==自上而下的元素每一个都/2的分给下两个元素

代码:

public class 承压计算 {
    static long[][] a = new long[30][30];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long factor = 1;
        // 1:循环30次 计算出2的30次方
        for (long i = 0; i < 30; i++)factor<<=1;

        //  2:存入数据
        for (int i = 0; i < 29; i++) {
            for (int j = 0; j <= i; j++) {
                long b = sc.nextLong();
                a[i][j]= b*factor;
            }
        }
        // 3:自上而下的处理a[i][j]*f -->/2 计入a[i+1][j] a[i+1][j+1]
        for (int i = 0; i < 29; i++) {
            for (int j = 0; j <= i; j++) {
                // 每个数都要*f 保证数据够大 然后/2 均分给下面2个元素
                long half =a[i][j]/2;
                a[i+1][j]+=half;   // 行加+1 列不变 也就是当前元素的左下一个元素
                a[i+1][j+1]+=half; // 行+1 列+1 代表当前元素的坐下和右下2个元素均分到half
            }
        }

        // 对二维数组按第一列进行升序排序
        Arrays.sort(a[29]);
        // 发现最后的最小值是2086458231的倍数 /2 就是答案
        System.out.print(a[29][0]/2+" ");
        System.out.print(a[29][29]/2);
//        System.out.print("72665192664");

    }
}

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值