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

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-06-06:大妈一开始手上有x个鸡蛋,她想让手上的鸡蛋数量变成y, 操作1 : 从仓库里拿出1个鸡蛋到手上,x变成x+1个, 操作2 : 如果手上的鸡蛋数量是3的整数倍,大妈可以直接把三分之相关的知识,希望对你有一定的参考价值。

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的整数倍,大妈可以直接把三分之的主要内容,如果未能解决你的问题,请参考以下文章

取鸡蛋问题

鸡蛋掉落

扔鸡蛋

LeetCode887鸡蛋掉落——dp

N个鸡蛋放进M个篮子(不能为空),求出满足要求的所有鸡蛋方法:(如问题补充)

一个程序员的转行坎坷历程