题解 | #简单的烦恼#

简单的烦恼

https://ac.nowcoder.com/acm/problem/25184

原题传送门

题目理解


这道题说是简单的烦恼,其实也十分简单。
将题目简单整理一下:

  1. 你的歌单里有 首歌。
  2. 歌单里的每一首歌的时长为 ,其中 为一个长度为 的序列。
  3. 你设置了一个 个单位时间的定时关闭。
  4. 定时关闭时间到达之后,将正在播放的最后一首歌放完后关机。
  5. 你想使得你听歌曲的时间最长,问最多是多少时间。
  6. 这题有 组 测试数据。

解法思路


之后,我们来想一想解法:
换作我,如果我想让我所听时间最长,我一定会把那首最长的歌在第 个单位时间(结束前的一刻)让它播放。
这样就可以使得听到时间最长。


所以这个问题被转化为了 “在 个单位时间内,听 首(除去最长的那首)曲子”。
也就是说, 再仔细一想,这不就是一个01背包问题吗?其中背包总容量为 ,共有 件物品,每一件物品的体积和价值都是


接着,我们考虑一些细节:

  1. 这题的每一个测试点都有 组 测试数据,所以如果我们要用动态规划,这个 f[] 数组要用 memset() 清理,同时每一次输出之后要换行,防止出错。
  2. 我们如何把 首曲子中最长的那一首从数组中除去呢?这里有两种方法:
    1. 在输入的时候使用两个变量来分别存储最长的歌的长度,和这首歌的下标。然后在循环递推时判断,如果遍历到了那首歌,就直接 continue
      2.将数组 a[] 直接升序排个序。循环的时候只循环 a[1]~a[n-1] 最大的那首歌自然就被除去了。

AC 代码

#include<bits/stdc++.h>
using namespace std;
const int N=80005;
int T;
int n,t;
int a[210];
int f[210][N];
int main(){
	cin>>T;
	while(T--){
		memset(f,0,sizeof(f)); // 多测不清空,爆0两行泪
		cin>>n>>t;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		sort(a+1,a+1+n); // 排序
      	// 二维的01背包
		for(int i=1;i<=n-1;i++){
			for(int j=0;j<=t-1;j++){
				f[i][j]=f[i-1][j];
				if(j>=a[i]){
					f[i][j]=max(f[i][j],f[i-1][j-a[i]]+a[i]);
				}
			}
		}
		cout<<f[n-1][t-1]+a[n]<<endl; // f[n-1][t-1] (t-1个单位时间内的最大值)+ a[n] (最后也是最长的的一首曲子)
	}
	return 0;
}

全部评论

相关推荐

自从我室友在计算机导论课上听说了“刷&nbsp;LeetCode&nbsp;是进入大厂的敲门砖”,整个人就跟走火入魔了一样。他在宿舍门口贴了一张A4纸,上面写着:“正在&nbsp;DP,请勿打扰,否则&nbsp;Time&nbsp;Limit&nbsp;Exceeded。”日记本的扉页被他用黑色水笔加粗描了三遍:“Talk&nbsp;is&nbsp;cheap.&nbsp;Show&nbsp;me&nbsp;the&nbsp;code。”连宿舍聚餐,他都要给我们讲解:“今天的座位安排可以用回溯算法解决,但为了避免栈溢出,我建议用动态规划。来,这是状态转移方程:dp[i][j]&nbsp;代表第&nbsp;i&nbsp;个人坐在第&nbsp;j&nbsp;个位置的最优解。”我让他去楼下取个快递,他不直接去,非要在门口踱步,嘴里念念有词:“这是一个图的遍历问题。从宿舍楼(root)到驿站(target&nbsp;node),我应该用&nbsp;BFS&nbsp;还是&nbsp;DFS?嗯,求最短路径,还是广度优先好。”和同学约好出去开黑,他会提前发消息:“集合点&nbsp;(x,&nbsp;y),我们俩的路径有&nbsp;k&nbsp;个交点,为了最小化时间复杂度,应该在&nbsp;(x/2,&nbsp;y/2)&nbsp;处汇合。”有一次另一个室友低血糖犯了,让他帮忙找颗糖,他居然冷静地分析道:“别急,这是一个查找问题。零食箱是无序数组,暴力查找是&nbsp;O(n)。如果按甜度排序,我就可以用二分查找,时间复杂度降到&nbsp;O(log&nbsp;n)。”他做卫生也要讲究算法效率:“拖地是典型的岛屿问题,要先把连通的污渍区块都清理掉。倒垃圾可以用双指针法,一个指针从左往右,一个从右往左,能最快匹配垃圾分类。”现在我们宿舍的画风已经完全变了,大家不聊游戏和妹子,对话都是这样的:“你&nbsp;Two&nbsp;Sum&nbsp;刷了几遍了?”“别提了,昨天遇到一道&nbsp;Hard&nbsp;题,我连暴力解都想不出来,最后只能看题解。你呢?”“我动态规划还不行,总是找不到最优子结构。今天那道接雨水给我整麻了。”……LeetCode&nbsp;真的害了我室友!!!
老六f:编程嘉豪来了
AI时代还有必要刷lee...
点赞 评论 收藏
分享
鱼专:你没有问题,有问题的是java市场,我有实习经历都捞不到实习,走一步看一步吧
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务