最多可以买到的苹果数量
楼下水果店正在促销,你打算买些苹果,arr[i] 表示第 i 个苹果的单位重量。
你有一个购物袋,最多可以装 5000 单位重量的东西,算一算,最多可以往购物袋里装入多少苹果。
1 | class Solution { |
进击的骑士
一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,你的 骑士 驻扎在坐标为 [0, 0] 的方格里。
骑士的走法和中国象棋中的马相似,走 “日” 字:即先向左(或右)走 1 格,再向上(或下)走 2 格;或先向左(或右)走 2 格,再向上(或下)走 1 格。
每次移动,他都可以按图示八个方向之一前进。
现在,骑士需要前去征服坐标为 [x, y] 的部落,请你为他规划路线。
最后返回所需的最小移动次数即可。本题确保答案是一定存在的。
1 | class Solution { |
找出所有行中最小公共元素
给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了。请你帮忙找出在所有这些行中 最小的公共元素。
如果矩阵中没有这样的公共元素,就请返回 -1。
1 | class Solution { |
建造街区的最短时间
你是个城市规划工作者,手里负责管辖一系列的街区。在这个街区列表中 blocks[i] = t 意味着第 i 个街区需要 t 个单位的时间来建造。
由于一个街区只能由一个工人来完成建造。
所以,一个工人要么需要再召唤一个工人(工人数增加 1);要么建造完一个街区后回家。这两个决定都需要花费一定的时间。
一个工人再召唤一个工人所花费的时间由整数 split 给出。
注意:如果两个工人同时召唤别的工人,那么他们的行为是并行的,所以时间花费仍然是 split。
最开始的时候只有 一个 工人,请你最后输出建造完所有街区所需要的最少时间。
1 | 示例 1: |
提示:
- 1 <= blocks.length <= 1000
- 1 <= blocks[i] <= 10^5
- 1 <= split <= 100
//
//贪婪: 挑最小的两个合并(取大值+split)成新节点
class Solution {
public:
int minBuildTime(vector<int>& blocks, int split) {
multiset<int> vals(blocks.begin(), blocks.end());
while (vals.size() > 1)
{
int minVal = *vals.begin();
vals.erase(vals.begin());
int minVal2 = *vals.begin(); //这个一定比前一个大或相等
vals.erase(vals.begin());
vals.insert(minVal2 + split);
}
return *vals.begin();
}
};