蒜头君的电脑里面有一些歌。现在他需要把这些歌装进一个硬盘里面。 硬盘大小有限,由于蒜头君下载的都是无损版本,每首歌的占用空间比较大,硬盘不一定装得下,然后他需要压缩其中的一部分歌曲这样他才能将尽可能多的歌曲装进他的硬盘里。 但是他想尽量压缩的歌曲数量尽量少,他不知道该怎么做,就来找你帮忙了。 输入格式 输入的第一行包含两个整数 nn 和 mm(1\le n\le 10^{5}1≤n≤10 5 ,1\le m\le 10^{9}1≤m≤10 9 ),分别表示蒜头君电脑里面歌曲的个数和他的硬盘大小(单位:字节)。 然后输入nn 行,每一行两个整数 a_ia i 和 b_ib i (1\le b_i\lt a_i\le10^{9}1≤b i <a i ≤10 9 ),分别表示第 ii 首歌曲原本的大小和被压缩后的大小(单位:字节)。 输出格式 输出只有一个整数,蒜头君至少需要压缩的歌曲的数量。 如果所有的歌曲都压缩的硬盘还是装不下,输出 -1−1。
时间: 2024-02-16 12:01:16 浏览: 167
这是一个贪心的问题,我们首先将所有的歌曲按照压缩后的大小减去原本的大小从大到小排序,然后依次将每首歌曲尝试压缩,直到硬盘的空间被占满为止。如果所有的歌曲都被压缩了仍然无法占满硬盘,则输出 -1。
具体实现时,我们可以用一个变量 sum 记录当前压缩后的歌曲占用的空间,用一个变量 cnt 记录已经压缩的歌曲数量,然后按照上述方法依次遍历歌曲并进行压缩,直到 sum 超过了 m 或者所有歌曲都被压缩了为止。如果 sum 超过了 m,说明无法将所有的歌曲都装进硬盘,输出 -1,否则输出 cnt。
代码如下:
相关问题
输入的第一行包含两个整数 nn 和 mm(1\le n\le 10^{5}1≤n≤10 5 ,1\le m\le 10^{9}1≤m≤10 9 ),分别表示蒜头君电脑里面歌曲的个数和他的硬盘大小(单位:字节)。 然后输入nn 行,每一行两个整数 a_ia i 和 b_ib i (1\le b_i\lt a_i\le10^{9}1≤b i <a i ≤10 9 ),分别表示第 ii 首歌曲原本的大小和被压缩后的大小(单位:字节)。
这是一个关于音乐文件压缩的问题,输入的第一行包含两个整数n和m,分别表示音乐文件的数量和磁盘可用空间。接下来的n行中,每行包含两个整数ai和bi,表示第i个音乐文件原本的大小和被压缩后的大小。
其中,ai>bi表示文件被压缩后大小变小,可以占用更少的空间。题目要求在给定的磁盘空间内,尽可能多地存储被压缩后的音乐文件,并输出可以存储的最大文件数量。
这是一个经典的贪心问题,可以按照文件压缩后大小的顺序进行排序,然后逐一加入可用空间内,直到无法再加入为止。具体的实现方式可以使用 C++ STL 中的 sort() 函数进行排序,然后用一个变量 sum 表示已经占用空间,逐一加入文件,并将 sum 的值累加,直到 sum 大于等于可用空间 m 为止,此时已经无法再加入新的文件,输出已经加入的文件数量即可。
蒜头君二分查找(四)
蒜头君的二分查找(四)问题是关于在一个长度为n的数组A中,找出等于x的数字的个数。下面是一个使用二分查找算法解决这个问题的示例代码:
```python
def binary_search(nums, target):
left = 0
right = len(nums) - 1
lower = -1
upper = -1
# 寻找左边界
while left <= right:
mid = (left + right) // 2
if nums[mid] >= target:
right = mid - 1
else:
left = mid + 1
if nums[mid] == target:
lower = mid
# 寻找右边界
left = 0
right = len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] <= target:
left = mid + 1
else:
right = mid - 1
if nums[mid] == target:
upper = mid
if lower == -1 or upper == -1:
return 0
else:
return upper - lower + 1
# 示例输入
n = 6
A = [1, 2, 2, 3, 3, 3]
x = 2
# 调用二分查找函数
count = binary_search(A, x)
print("在数组A中,等于x的数字有", count, "个")
```
这段代码首先定义了一个`binary_search`函数,该函数接受一个已排序的数组`nums`和目标值`target`作为参数。函数中使用两次二分查找来找到目标值的左边界和右边界,然后计算出等于目标值的数字个数。最后,我们可以通过调用`binary_search`函数来解决蒜头君的问题。
阅读全文