Atcoder ABC340 C - Divide and Divide

这篇具有很好参考价值的文章主要介绍了Atcoder ABC340 C - Divide and Divide。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Divide and Divide(分而治之)

时间限制:2s 内存限制:1024MB

【原题地址】

所有图片源自Atcoder,题目译文源自脚本Atcoder Better!

点击此处跳转至原题

【问题描述】

Atcoder ABC340 C - Divide and Divide,Java算法题解,java,算法

【输入格式】

Atcoder ABC340 C - Divide and Divide,Java算法题解,java,算法
Atcoder ABC340 C - Divide and Divide,Java算法题解,java,算法

【输出格式】

Atcoder ABC340 C - Divide and Divide,Java算法题解,java,算法

【样例1】

【样例输入1】

3

【样例输出1】

5

【样例说明1】

Atcoder ABC340 C - Divide and Divide,Java算法题解,java,算法

【样例2】

【样例输入2】

340

【样例输出2】

2888

【样例3】

【样例输入3】

100000000000000000

【样例输出3】

5655884811924144128

【解题思路】

老汉使用到的是记忆递归的解题方式

本题是求将 n 分解至 n 个 1 所花费的金额。
如果单纯的使用关系式 f(n)=f(n/2)+f((n+1)/2)+n 求解答案,对于数值较小的 n 可以在规定时间内解决,但当n的值特别大时,由于过程中有许多重复计算的步骤,所花费的时间将会超出规定时间,因此老汉使用到记忆递归的方式对每次计算出来的 f(n) 的值都进行保存,减少了不必要的重复计算,使计算效率提高。

代码注释有详细过程文章来源地址https://www.toymoban.com/news/detail-829352.html

【代码】

package ABC340_C_DivideandDivide;

import java.util.HashMap;
import java.util.Scanner;

public class Main {
	// 记忆集合m
	HashMap<Long, Long> m = new HashMap<Long, Long>();

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		long n = scan.nextLong();
		Main ma = new Main();
		System.out.println(ma.divide(n));
		scan.close();
	}

	/**
	 * 使用记忆递归,保存每一步求值结果,减少重复计算,缩短计算时间
	 * 
	 * @param n 所要求值的数
	 * @return 所需支付的总金额
	 */
	public long divide(long n) {
		// 当n为1时无需再进行计算
		if (n == 1) {
			return 0;
		}
		// 当记忆集合m中存有对应值时,直接调用该对应结果
		else if (m.get(n) != null) {
			return m.get(n);
		}
		// 当记忆集合中不存在对应值,利用关系式进行计算存储
		m.put(n, divide(n / 2) + divide((n + 1) / 2) + n);
		// 放回计算后得出的结果
		return m.get(n);
	}

}

到了这里,关于Atcoder ABC340 C - Divide and Divide的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AtCoder Beginner Contest 340

    给定等差数列的 首项 、 末项 、 公差 。 输出这个等差数列。 从 首相 依次累加 公差 到 末项 即可。 神奇的代码 依次进行 (Q) 次操作,分两种。 1 x ,将 x 放到数组 (a) 的末尾。 2 k ,输出数组 (a) 的倒数第 (k) 项。 用 vector 模拟即可,操作 2 可快速寻址访问。 神奇的代

    2024年02月19日
    浏览(33)
  • 学习笔记17:AtCoder Beginner Contest 340

    C C - Divide and Divide (atcoder.jp) 1e17暴力肯定不行 模拟暴力的过程我们发现很多运算是重复的 记忆化一下 D https://atcoder.jp/contests/abc340/tasks/abc340_d E https://atcoder.jp/contests/abc340/tasks/abc340_e 线段树处理 操作:查询在位置上的值sum,然后修改这个该位置的值为y         然后给整个数组

    2024年02月19日
    浏览(35)
  • AtCoder Beginner Contest 321(ABC321)

    直接模拟。 直接暴力枚举 ([0sim100]) ,每次把第 (n) 个数当作当前枚举的 (i) ,然后看看条件是否满足。 给你一个 (K) ,求出 ([1 sim K]) 区间内有多少个 321-like Number 。 321-like Number 的定义: 每一位上的数字从左到右严格单调递减。 或者说,若它有 (d) 位,对于 (for

    2024年02月08日
    浏览(33)
  • AtCoder Beginner Contest 292 (A - E) 记录第一场ABC

    本来晚上在打Acwing周赛,最后一题Trie想不出来咋写,看群里有人说ABC要开始了,想着没打过ABC就去报了一下,感觉难度大概是cf的Div3到Div4之间吧,总共写了五个题,E题想复杂了快结束才交过。总的来说手速很重要。 题意:给一个字符串,要求把小写字母改成大写。 分析:

    2023年04月19日
    浏览(31)
  • Python高级数据结构——分治法(Divide and Conquer)

    分治法是一种将问题划分为更小的子问题,解决子问题后再将结果合并的算法设计方法。它常被应用于解决复杂问题,如排序、搜索、图问题等。在本文中,我们将深入讲解Python中的分治法,包括基本概念、算法框架、具体应用场景,并使用代码示例演示分治法在实际问题中

    2024年02月05日
    浏览(33)
  • abc343G 题解

    给你 (N) 个由小写字母组成的字符串 (S_1, S_2, ldots, S_N) ,找出一个母串使得它包含所有这些字符串作为它的子串,最小化该母串的长度并输出。 (1 leq N leq 20) , (sum |S_i| leq 2 times 10 ^ 5) (没错洛谷翻译就是我写的) 首先如果有一个字符串被另一个字符串完全包括,那

    2024年03月09日
    浏览(90)
  • [ABC318E] Sandwiches 题解

       给定包含 (n) 个整数的序列 (a) ,其中任意元素的值 (a_i in [1,n]) ,统计包含三个元素的满足以下条件有序三元组数量:满足下标严格递增;满足第一个和最后一个元素相等,而中间的元素和两端的元素不相等。    记录三元组 ((a_i,a_j,a_k)) ,即 (1 le i j k le n ,

    2024年02月10日
    浏览(44)
  • ABC330 A-E 题解

    枚举一遍,当前数大于 (L) 使 (ans+1) 即可. 枚举一遍,当前数在 (L,R) 之间,结果就是它本身,小于 (L) 为 (L) ,大于 (R) 为 (R) . 枚举 (i:0simsqrt{d}) 为第一个数,以 (1) 为左边界, (sqrt{d-i^2}+1) 为右边界,判定条件为 (mid^{2}) 与 (d-i^2) 之间的大小关系,每次更新边界后 (ans=

    2024年02月05日
    浏览(44)
  • ABC341A-D题解

    这个没什么好说的,就先输出一个 1 ,再输出 n n n 个 01 就大功告成了。 要获取更多 x x x 国货币,只能用 x − 1 x - 1 x − 1 国货币换。 所以我们可以从 1 1 1 国一直换到 n n n 国,输出,结束。 你会发现, 50 0 3 2 ⋅ 1 0 8 500^32cdot10^8 50 0 3 2 ⋅ 1 0 8 ,所以可以暴力枚举高桥所在

    2024年02月19日
    浏览(33)
  • [ABC319E] Bus Stops 题解

      给定 (n) 个公交站。对于第 (i) 个公交站,在时刻 (p_i times k,k in mathbb{N}) 有一辆公交车出发,在经过 (t_i) 的时间后,到达第 (i+1) 个公交站。   在走到第一个公交车之前需要走 (X) 时刻,做到最后一个公交站之后下车以后还需要走 (Y) 时刻。   约束: (1

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包