寒训2J 樱花

news/2024/11/29 10:50:06/

题意

爱与愁大神后院里种了 棵樱花树,每棵都有美学值 。爱与愁大神在每天上学前都会来赏花。爱与愁大神可是生物学霸,他懂得如何欣赏樱花:一种樱花树看一遍过,一种樱花树最多看 遍,一种樱花树可以看无数遍。但是看每棵樱花树都有一定的时间 。爱与愁大神离去上学的时间只剩下一小会儿了。求解看哪几棵樱花树能使美学值最高且爱与愁大神能准时(或提早)去上学。

思路

首先很明确:这是一道背包问题,空间和价值都非常明确(空间即时间,价值即美学值),“看一遍“”看无数遍”“看遍”对应了三种背包:01背包、完全背包和多重背包,所以我们直接分类处理就好啦!

读入时间可以直接用scanf来处理,十分方便。但是写完提交发现两个TLE后我们发现了问题:朴素的多重背包是经不住毒瘤数据的洗礼的。

我们需要优化!!

这里可以对多重背包使用二进制优化:将n个物品拆成1+2+4+...+的形式(其中x是余项),此时选择1~n个物品等价于选择1个物品、2个物品、4个物品、......、个物品和x个物品里的其中若干个,所以直接把n个物品进行拆分是可行的。

这样我们就可以把多重背包转换为01背包了!而完全背包也可以看作数量巨大的多重背包,最后转化为01背包进行处理。

自此,这道题在一通拆分后只剩下对01背包的处理了,这里不多赘述,直接上代码吧。

代码

#include <iostream>
using namespace std;
int shh, smm, ehh, emm, T;
int n;
int p[500000], c[500000], t[500000];
int dp[1005];int main() {scanf("%d:%d %d:%d", &shh, &smm, &ehh, &emm);T = (ehh - shh) * 60 + (emm - smm);cin >> n;int temN = n;for (int i = 1; i <= temN; ++i) {cin >> t[i] >> c[i] >> p[i];if (p[i] == 0)p[i] = 999999;if (p[i] != 1) {int x = 1;int sumX = 0;while (sumX + x < p[i]) {        //二进制拆分的方法(以8为例): 8 = 1 + 2 + 4 + 1t[++n] = t[i] * x;p[n] = 1;c[n] = c[i] * x;sumX += x;x <<= 1;}x = p[i] - sumX;t[i] = t[i] * x;p[i] = 1;c[i] = c[i] * x;}}for (int i = 1; i <= n; ++i) {if (c[i] == 0)continue;for (int j = T; j >= t[i]; --j) {dp[j] = max(dp[j], dp[j - t[i]] + c[i]);//cout << j << " " << dp[j] << endl;}}cout << dp[T];return 0;
}

http://www.ppmy.cn/news/354532.html

相关文章

dm8 datawatch配置

环境说明 操作系统 Kylin Linux Advanced Server V10(Sword) 达梦版本 DM8 配置说明 –2台服务器&#xff08;主备机&#xff09; –1台服务器&#xff08;监视器&#xff09; 过程中错误说明 没有关闭防火墙&#xff0c;导致第一次配置失败。 端口规划 数据库名 实…

mt7682芯片处理器详细资料介绍

MTK MT7682S是基于一个高度集成的芯片组&#xff0c;包括一个微控制器单元(MCU)、一个低功耗的1x11n单波段Wi-Fi子系统和一个电源管理单元(PMU)。单片机是一个带有浮点单元的ARM Cortex-M4处理器&#xff0c;与1MB的闪存集成在一起。 Wi-Fi子系统包含802.11b/g/n无线电、基带和…

centos7使用mdadm搭建磁盘阵列

一、搭建 1、安装yum -y install mdadm 2、创建阵列 mdadm -Cv /dev/md5 -l 5 -n 2 /dev/sdb /dev/sdc /dev/sdd 或是 mdadm -Cv /dev/md5 --level5 --raid-devices3 /dev/sdb /dev/sdc /dev/sdd 参数详解&#xff1a; -C 创建阵列 -l 指定raid级别 5 -v 显示细节 -x, --s…

找回QQ密码

什么都没有的去qq 怎么找回密码 只有一个邮箱 在线等

教你看别人的QQ密码

教你看别人的 QQ密码&#xff1a; 随便点个好友&#xff0c;在QQ对话框中&#xff0c;输入"我是"两字&#xff0c;不要发送(记好不要发送&#xff09; 再按住ALT键&#xff0c; 然后顺序按小键盘294.82&#xff0c;松开ALT键&#xff0c; 你将会发现。。。。。 转载于…

腾讯QQ修改密保手机

这两天修改QQ的密保手机&#xff0c;真是坑血。 我要修改的密保手机号码已经不用了&#xff0c;所以每次验证实名&#xff0c;以前的密码&#xff0c;绑定的邮箱&#xff0c;加过的好友&#xff08;我都没有好友了&#xff0c;我都删了&#xff09;。 每次这样验证都不行&…

简单的密码修改

废话不多说&#xff0c;直接看图&#xff1a;由上而下 第一步&#xff1a;点击编辑按钮&#xff0c;编辑按钮隐藏&#xff0c;文本框、取消按钮、提交按钮都显示如图二 图一 第二步&#xff1a;点击对号√在文本框内直接修改密码&#xff0c;修改完成&#xff0c;提交后如图三&…