2022-06-06:大妈一开始手上有x个鸡蛋,她想让手上的鸡蛋数量变成y,
操作1 : 从仓库里拿出1个鸡蛋到手上,x变成x+1个,
操作2 : 如果手上的鸡蛋数量是3的整数倍,大妈可以直接把三分之二的鸡蛋放回仓库,手里留下三分之一。
返回从x到y的最小操作次数。
1 <= x,y <= 10^18。

答案2022-06-06:

平凡解limit。当x大于y时,x加1到能被3整除时,然后整除,一直到等于y为止。

代码用rust编写。代码如下:

use rand::Rng;
fn main() {
let max = 3000;
let test_time = 500;
println!("测试开始");
for _ in 0..test_time {
let x = rand::thread_rng().gen_range(0, max) + 1;
let y = rand::thread_rng().gen_range(0, max) + 1;
let ans1 = min_times1(x, y);
let ans2 = min_times2(x, y);
if ans1 != ans2 {
println!("出错了!");
println!("x = {}", x);
println!("y = {}", y);
println!("{}", ans1);
println!("{}", ans2);
break;
}
}
println!("测试结束");
} // 彻底贪心!
fn min_times1(x: i32, y: i32) -> i32 {
if x <= y {
return y - x;
}
// 0 0
// 1 2
// 2 1
let mod0 = x % 3;
// 鸡蛋拿到3的整数倍,需要耗费的行动点数
let need = if mod0 == 0 {
0
} else {
if mod0 == 1 {
2
} else {
1
}
};
return need + 1 + min_times1((x + 2) / 3, y);
} fn min_times2(x: i32, y: i32) -> i32 {
if x <= y {
return y - x;
}
let limit = min_times1(x, y);
let mut dp: Vec<Vec<i32>> = vec![];
for i in 0..x + limit + 1 {
dp.push(vec![]);
for _ in 0..limit + 1 {
dp[i as usize].push(0);
}
}
return process(x, y, 0, limit, &mut dp);
} // 当前鸡蛋数量cur,目标aim
// 之前已经用了多少行动点,pre
// limit : 一定行动点,超过limit,不需要尝试了!
fn process(cur: i32, aim: i32, pre: i32, limit: i32, dp: &mut Vec<Vec<i32>>) -> i32 {
if pre > limit {
return 2147483647;
}
if dp[cur as usize][pre as usize] != 0 {
return dp[cur as usize][pre as usize];
}
let mut ans = 0;
if cur == aim {
ans = pre;
} else {
let p1 = process(cur + 1, aim, pre + 1, limit, dp);
let mut p2 = 2147483647;
if cur % 3 == 0 {
p2 = process(cur / 3, aim, pre + 1, limit, dp);
}
ans = get_min(p1, p2);
}
dp[cur as usize][pre as usize] = ans;
return ans;
} fn get_min<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a < b {
a
} else {
b
}
}

执行结果如下:


左神java代码

2022-06-06:大妈一开始手上有x个鸡蛋,她想让手上的鸡蛋数量变成y, 操作1 : 从仓库里拿出1个鸡蛋到手上,x变成x+1个, 操作2 : 如果手上的鸡蛋数量是3的整数倍,大妈可以直接把三分之的更多相关文章

  1. SQL日期格式转换(经常用又经常忘记的东西)转载自http://www.cnblogs.com/wangyuelang0526/archive/2012/06/06/2538224.html

    Select CONVERT(varchar(100), GETDATE(), 8):14:53:14Select CONVERT(varchar(100), GETDATE(), 9): 06 6 ...

  2. winform里操作打开在panel里的form窗体,子窗体操作同级子窗体或者父窗体的方法

    最近开始了一个winform项目,原先一直都是web项目.遇到个问题,就是在框架内,左侧和中间的main都是用panel来实现的form,就是把form窗体打开到panel里,实现左侧是导航,中间是操 ...

  3. Andriod一段时间未操作页面,系统自动登出

    功能描述: APP在公共的设备上运行,出于安全考虑,当登录的用户在超过一定时间内没有做任何操作, 则系统自动登出,用户如需重新操作APP,则需要重新登录 . 第一步:创建一个BaseActivity ...

  4. Java操作数据库——在JDBC里使用事务

    Java操作数据库——在JDBC里使用事务 摘要:本文主要学习了如何在JDBC里使用事务. 使用Connection的事务控制方法 当JDBC程序向数据库获得一个Connection对象时,默认情况下 ...

  5. JZOJ 7685. 【2022.10.06冲剌NOIP2022模拟】奇怪的函数(function)

    \(\text{Solution}\) 观察到关于 \(x\) 的函数在 \(n\) 个操作之后一定是这样的: 一段水平直线加上一段斜率为 \(1\) 的直线再加上一段水平直线 于是线段树维护这个分段 ...

  6. JZOJ 2022.07.06【提高组A】模拟

    历程 被暴打了 原因是钻进了 \(T4\) 的坑中... 先看完题,发现 \(T4\) 比较有意思,\(T2\) 没有想法 \(T3\) 挺容易,做法似乎很好想 \(T1\) 送分,十几分钟搞定 然后 ...

  7. 手机APP功能测试经验分享2016.06.06

    1.登录时,Android和IOS同样的操作,提示信息不一致: 2.注册等页面切换成横屏容易不兼容.把内存卡去掉,再发送图片.音频.视频容易出错. 3.Android和IOS同样的功能,同样的原型图, ...

  8. 转载 Servlet3 的 @WebServlet http://www.cnblogs.com/luxh/archive/2012/06/06/2537458.html

    我使用的开发环境:MyEclipse10+Tomcat7+JDK6. 开发Servlet3的程序需要一定的环境支持.Servlet3是Java EE6规范的一部分,MyEclipse10和Tomcat ...

  9. 2020/06/06 JavaScript高级程序设计 面向对象的程序设计

    ECMAScript虽然是一种面向对象的语言,但是他没有类的概念.所以他的对象也与其他语言中的对象有所不同. ECMA-262定义对象:一组没有特定顺序的值. 6.1 理解对象 创建对象的方法: 1. ...

  10. WINFORM数据库操作,有点像安装里面的SQLITE

    程序设计要求 设计一个用户管理系统,对系统中的用户进行管理.假定,用户表中有下列字段:用户名,密码,电话和 email 等信息.要求,1)利用 SQL server 首先创建用户数据表:2)实现对用户 ...

随机推荐

  1. 总项目的pom文件

    注意修改子模块名称!!!!!!!!!!!!!!!!!!<?xml version="1.0" encoding="UTF-8"?> <proj ...

  2. WordPress安全方案

    一.WordPress介绍WordPress是一款世界级的网站内容管理系统,因其系统结构科学合理,功能强大,操作简单,拥有海量用户.和其他CMS一样,安全漏洞也是其无法避免的问题.虽然官方不断发布补丁 ...

  3. Qt 学习笔记 - 第三章 - Qt的三驾马车之一 - 串口编程 + 程序打包成Windows软件

    Qt 学习笔记全系列传送门: Qt 学习笔记 - 第一章 - 快速开始.信号与槽 Qt 学习笔记 - 第二章 - 添加图片.布局.界面切换 [本章]Qt 学习笔记 - 第三章 - Qt的三驾马车之一 ...

  4. Redis中 HyperLogLog数据类型使用总结

    转载请注明出处: 目录 1. HyperLogLog 的原理 2.使用步骤 3.实现请求ip去重的浏览量使用示例 4.Jedis客户端使用 5.Redission使用依赖 6.HyperLogLog ...

  5. Linux 多服务器时间同步设置

    找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间. 一.配置时间服务器具体步骤

  6. jmeter关于常用取样器的设置

      常用创建操作   1.线程组:测试计划(右键)-->线程(用户)-->线程组   2.http请求:线程组(右键)-->取样器-->http请求   3.察看结果树:线程组 ...

  7. 使用requests的session发送请求

    import requests # (1)网址 url = 'https://www.xslou.com/login.php' # (2)输入登录框-->输入密码框-->点击登录找到php ...

  8. 【Visual Leak Detector】QT 中 VLD 输出解析(二)

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记. 目录 说明 1. 使用方式 2. 有一处内存泄漏时的输出报告(int 型) 3. 有一处内存泄漏时的输出报告(int 数组型) 1. 使 ...

  9. 保持唯一性,请停止使用【python3 内置hash() 函数】

    问题: 如图,用hash() 筛重时竟然出现了重复. 如下图: hash字符串时,同一窗口的是一致的,不同窗口结果竟然不同. 原因: python的字符串hash算法并不是直接遍历字符串每个字符去计算 ...

  10. Qt源码阅读(三) 对象树管理

    对象树管理 个人经验总结,如有错误或遗漏,欢迎各位大佬指正 @ 目录 对象树管理 设置父对象的作用 设置父对象(setParent) 完整源码 片段分析 对象的删除 夹带私货时间 设置父对象的作用 众 ...