Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

  • 链表

  • 字符串

  • 二叉树

  • 动态规划

  • 深搜回溯

  • 数学贪心

    • LCP 33. 蓄水
    • 6455. 使所有字符相等的最小成本
    • 55. 跳跃游戏
    • 2517. 礼盒的最大甜蜜度
    • 2611. 老鼠和奶酪
    • 6449. 收集巧克力
      • 1.枚举+贪心
    • 1401. 圆和矩形是否有重叠
    • 2178. 拆分成最多数目的正偶数之和
    • 376. 摆动序列
    • 649. Dota2 参议院
    • 630. 课程表 III
    • 2136. 全部开花的最早一天
    • 2731. 移动机器人
  • 堆栈队列

  • 前缀和

  • 算法设计

  • 位运算

  • WA

  • 算法
  • 数学贪心
phan
2023-06-11
目录

6449. 收集巧克力

# 6449. 收集巧克力 (opens new window)

# 1.枚举+贪心

分析:同种类型的巧克力通过移动,总共可以有nums.length种可能的成本价格。换而言之,整个成本数组可以移动的最大轮次为nums.length。移动最后一次后,每种类型的巧克力成本又恢复初始状态,而此时总价和初始状态相比还多了移动的成本价。因此最小成本总价一定是在前num.length-1次移动中。

假设当前移动了i次,用哈希保存每种类型巧克力在前i次移动中最小的成本价格(这里保存的是最小成本价对应的轮次)。每轮移动的总成本底价为round * x,round为轮次,x为移动一次的成本。采用贪心策略,每种巧克力成本价只选前i次搜索中的最小值,加入到当前轮次的总价计算中。

此处不需要考虑在当前轮次中是否出现至少一种类型巧克力的最小成本,因为在前面的轮次中已经被计算过,因此通过这种搜索策略不会错过最优方案。

class Solution {
    public long minCost(int[] nums, int x) {
       long res=Long.MAX_VALUE;
        Map<Integer,Integer> map=new HashMap<>();
        //i:轮次
        for(int i=0;i<nums.length;i++){
            long sum=(long)i*x;
            //j:元素下标
            for(int j=0;j<nums.length;j++){
                if(i==0){
                    map.put(j,0);
                    sum=sum+(long)nums[j];
                }
                else{
                    int minrounds=map.get(j);
                    long minprice=j-minrounds>=0?nums[j-minrounds]:nums[nums.length-(minrounds-j)];
                    long currprice=j-i>=0?nums[j-i]:nums[nums.length-(i-j)];
                    sum+=Math.min(currprice,minprice);
                    if(currprice<minprice){
                        map.put(j,i);
                    }
                }
            }
            res=Math.min(res,sum);
        }
        return res;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
编辑 (opens new window)
#Leetcode
上次更新: 2023/12/15, 15:49:57
2611. 老鼠和奶酪
1401. 圆和矩形是否有重叠

← 2611. 老鼠和奶酪 1401. 圆和矩形是否有重叠→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式