当前位置: 首页 > article >正文

【C++ 算法进阶】算法提升十三

目录标题

  • 抽牌概率问题 (动态规划)
    • 动态规划
    • 题目分析
    • 代码
  • 洗衣机问题 (贪心)
    • 题目
    • 题目分析

抽牌概率问题 (动态规划)

动态规划

假设现在有1~N N张牌 每张牌的序号就代表着他的大小 (1 2 … N)

现在假设你从该牌组中等概率的抽出一张之后放回

当累加和小于a的时候 你将一直抽牌

当累加和大于等于a 小于等于b的时候你赢

当累加和大于b的时候你输

现在请你返回你能获胜的概率

题目分析

这是谷歌的一道面试题 实际上是一道非常简单的动态规划题目

我们只需要考虑三种条件即可

  1. 假设当前值大于等于a 小于等于b 我们只需要返回1.0即可
  2. 假设当前值大于b 我们只需要返回0即可
  3. 假设当前值小于a 则我们需要返回所有可能性的和除以N

只要想到这三种可能性 代码其实并不难写

关键在于如何想到

一是要多练 练多了这种题目基本上看一眼就知道要使用什么解法

二是根据题目找信息 题目中给出了三种范围 那么我们肯定可以很自然的想到这三种范围代表什么呢?

显然 可能性1 2 代表边界条件 3代表可能性 之后写出递归代码即可

代码

double process(int cur, int N, int a, int b) {
	if (cur > b) {
		return 0.0;
	}

	if (cur >= a || cur <= b) {
		return 1.0;
	}

	double ans = 0;
	for (int i = 1; i <= N; i++) {
		ans += process(cur + i , N , a , b);
	}
	ans /= N;

	return ans;
}

洗衣机问题 (贪心)

题目

本题为阿里面试题

题目为 有N台洗衣机 有 X件衣服在各个洗衣机内 现在要求洗衣机平分衣服

每台洗衣机内存放着的衣服不固定 现在可以从左到右移动 每次移动每台洗衣机可以将一件衣服向左或者向右移动

现在请问至少要移动多少轮才能让每个洗衣机平分衣服

题目分析

本题是典型的贪心 你见过就会 没见过就不会

它的思路其实跟动态规划的样本对应模型有些类似

都是找出一个特殊点 之后分析左右两测的可能性

比如说我们假设中间点为X 左边洗衣机总共多出了12件衣服 右边少了17件衣服

那么我们就需要至少17轮才能平分 (求最大值)

又比如 左边少了12件 右边也少了12件 这说明都集中在当前位置了 那么就需要12 + 12轮才能平分

之后我们从左到右遍历即可 这里的代码很简单就不给出了

这一题我们主要需要学习到一个从一个点到整体的思路


http://www.kler.cn/a/389714.html

相关文章:

  • 【汇编器和编译器的区别】
  • 战场物联网:通信挑战与最新解决方案综述
  • 架构思考与实践:从通用到场景的转变
  • Spring Boot 集成 MongoDB:启动即注入的便捷实践
  • SpringBoot实现定时任务,使用自带的定时任务以及调度框架quartz的配置使用
  • 【Linux 重装】Ubuntu 启动盘 U盘无法被识别,如何处理?
  • HCIP小型园区网拓扑实验
  • Java基础Day-Seventeen
  • 【算法一周目】双指针(1)
  • Android Auto 不再用于旧手机
  • HTML5:网页开发的新纪元
  • 埃隆·马斯克的 AI 初创公司 xAI 推出了 API
  • 链式结构二叉树
  • css 实现展开合并按钮
  • 【JavaScript】JavaScript开篇基础(5)
  • 每日一题|3258. 统计满足 K 约束的子字符串数量 I|滑动窗口
  • 手写JDK动态代理实现AOP
  • c# 开发web服务 webserver
  • MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击
  • sql速度优化多条合并为一条语句
  • 关于git使用的图文教程(包括基本使用,处理冲突问题等等)超详细
  • 调整TCP参数, 优化网络性能
  • 基于springboot的家装平台设计与实现
  • 【HCIP园区网综合拓扑实验】配置步骤与详解(已施工完毕)
  • 整合本地市场机会 同城小程序打造社区商圈
  • Uniapp去除顶部导航栏-小程序、H5、APP适用