toj 3474 解题报告

本文介绍了一种通过递归二分法求和的算法,详细解释了解题思路和关键步骤,包括如何处理剩余一位的情况。通过具体示例展示了算法的应用过程,并提供了Java实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题的解题思路:就递归二分到剩两个时,把这两个数相乘加到结果sum中累加,注意当二分到只剩一位的时候就抛弃,左边的应该等于右边的或者多一位。

解题关键题目的提示:

Consider a dance with 11 cows numbered 1..11. Here is the sequence of dividing them:

1     2     3     4     5     6  |  7     8     9     10     11

    1     2     3  |  4     5     6

        1     2  |  3
                1  2        => 1*2=2 added to sum -> sum=2
                3           => sent home with rose

        4     5  |  6
                4  5        => 4*5=20 added to sum -> sum=22
                6           => sent home with rose

    7     8     9  | 10    11

        7     8  |  9
                7  8        => 7*8=56 added to sum -> sum=78
                9           => sent home with rose
        10    11            => 10*11=110 added to sum -> sum=188

So the sum for this dance would be 188.

import java.util.Scanner; public class Main3474 { private static long sum = 0; public static void mid(int[] arr, int size) { if (size == 2) { sum += (arr[0] * arr[1]); return; } else if (size == 1) return; // int mid = ((Double) StrictMath.ceil((double) size / 2)).intValue(); int mid = (size >> 1) + (size & 1);//size >> 1 相当于size/2 ; size & 1相当于 size % 2 // System.out.println("mid=" + mid); int[] leftArr = new int[mid]; int[] rightArr = new int[size - mid]; System.arraycopy(arr, 0, leftArr, 0, leftArr.length); System.arraycopy(arr, mid, rightArr, 0, rightArr.length); mid(leftArr, mid); mid(rightArr, rightArr.length); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextInt()) { sum = 0; int size = sc.nextInt(); int[] arr = new int[size]; for (int i = 0; i < size; ++i) { arr[i] = i + 1; } Main3474.mid(arr, arr.length); System.out.println(sum); } } }

其中,当一个int型的数除以2的幂时,可以用右移,此时原数与(&)上右移的位数就可以得到余数。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值