洛谷U14667 肝活动【比赛】 【状压dp】
题目描述
Yume 最近在玩一个名为《LoveLive! School idol festival》的音乐游戏。他之所以喜欢上这个游戏,是因为这个游戏对非洲人十分友好,即便你脸黑到抽不出好卡,还可以通过在每个月举办的两次活动中达成一定的目标来获得奖励。
Yume 很喜欢这一期活动奖励卡的卡面,于是他决定要肝这一期的活动,拿到活动奖励。这一期的活动规则很特殊,玩家需要在活动规定的结束时间前,完成所有指定的歌曲(每首歌曲只能打一次),并获得一定的分数,就可以拿到活动奖励。如果在规定的时间前没有完成所有的歌曲,或者分数不够奖励的分数线,则不能领取活动奖励。每首歌有一个限定的奖励开放时间,玩家如果在这段时间内完成了这首歌,便可以获得一定的分数(获得的分数
 = 开放时间 - 当前已用的总时间)。如果超出了这段时间之后再完成这首歌,就不能获得分数了。
这样的规则对 Yume 这样的老玩家来说本应是轻而易举,但不巧的是 Yume 把活动的结束时间记成了活动的开始时间,以至于当他上线跃跃欲试的时候,惊恐地发现活动已经快要结束了。现在他想知道,在剩余的时间之内,他能否完成所有的歌、达成奖励的分数线拿到活动卡。为了节省时间,他把这个问题交给了你来解决。请你根据给定的数据,帮他计算出能否在剩余的时间内达成目标。如果能,请告诉他完成每首歌曲的顺序。
输入输出格式
输入格式:
输入的第一行是三个整数 n, m, t,分别表示规定完成的歌曲数目、获得奖励需要达到的最低分数和距离活动结束剩余的时间。
接下来有 n 行,第 i 行有一个字符串 Si 和两个整数 Ti 和 Mi,表示第 i 首歌的歌名为 Si,完成第 i 首歌所需要的时间为 Ti,第 i 首歌的奖励开放时间剩余 Mi。保证 Ti ≤ Mi. 其中数据已按 Si 的字典序给出。
输出格式:
如果在活动结束前 Yume 可以完成指定的目标拿到奖励,则在第一行输出一个整数 C,表示在获得奖励的前提下,所能够获得的分数的最大值;接下来的 n 行中,按照完成歌曲的顺序输出第 i 首歌的歌名。如果有多种可能性,则输出字典序最小的情况。
如果在活动结束前 Yume 不能完成所有的歌曲,输出 No Answer .
输入输出样例
说明
对于 0% 的数据,与测试数据完全相同。
对于 20% 的数据,满足 n ≤ 5。
对于 40% 的数据,满足 n ≤ 9。
对于 70% 的数据,满足 n ≤ 15。
对于 100% 的数据,满足 n ≤ 22,Si 的长度不超过 50. 保证 m, t 和 Ti, Mi 以及其相加的结果都在 int 的最大范围内。
另有 10% 的数据满足 Sigma(T1, T2, …, Tn) < t.
题解
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define fo(i,x,y) for (int i = (x); i <= (y); i++)
#define Redge(u) for (int k = head[u]; k != -1; k = edge[k].next)
using namespace std;
const int maxn = 25,maxs = 55,maxm = 1 << 22,INF = 1000000000; inline int read(){
int out = 0,flag = 1;char c = getchar();
while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57) {out = out * 10 + c - 48; c = getchar();}
return out * flag;
} int f[maxm],tim[maxm],T[maxn],M[maxn],n,m,t,chs[maxm],pre[maxm];
char names[maxn][maxs]; void print(int s){
if (!s) return;
print(pre[s]);
printf("%s\n",names[chs[s]]);
} int main()
{
int tot = 0;
n = read(); m = read(); t = read();
REP(i,n){
scanf("%s",names[i]);
tot += (T[i] = read());
M[i] = read();
}
if (tot > t) {
cout<<"No Answer"<<endl;
return 0;
}
int maxv = (1 << n) - 1;
for (int s = 0; s <= maxv; s++) f[s] = -INF;
f[0] = 0;
for (int s = 0; s <= maxv; s++){
for (int i = 1; i <= n; i++){
int e = 1 << i - 1,v = M[i] - T[i] - tim[s];
if (v < 0) v = 0;
if ((s | e) != s && f[e | s] < f[s] + v){
f[s | e] = f[s] + v;
tim[s | e] = tim[s] + T[i];
pre[s | e] = s;
chs[s | e] = i;
}
}
}
if (f[maxv] < m) cout<<"No Answer"<<endl;
else {
printf("%d\n",f[maxv]);
print(maxv);
}
return 0;
}
洛谷U14667 肝活动【比赛】 【状压dp】的更多相关文章
- 【题解】洛谷P3959 [NOIP2017TG] 宝藏(状压DP+DFS)
		洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复 ... 
- 洛谷 P1278 单词游戏  【状压dp】
		题目描述 Io和Ao在玩一个单词游戏. 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致. 游戏可以从任何一个单词开始. 任何单词禁止说两遍,游戏中只 ... 
- 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
		题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ... 
- 洛谷P2761 软件补丁问题(状压DP,SPFA)
		题意 描述不清... Sol 网络流24题里面怎么会有状压dp?? 真是狗血,不过还是简单吧. 直接用$f[sta]$表示当前状态为$sta$时的最小花费 转移的时候枚举一下哪一个补丁可以搞这个状态 ... 
- 洛谷P2831 愤怒的小鸟——贪心?状压DP
		题目:https://www.luogu.org/problemnew/show/P2831 一开始想 n^3 贪心来着: 先按 x 排个序,那么第一个不就一定要打了么? 在枚举后面某一个,和它形成一 ... 
- 洛谷P2051 [AHOI2009] 中国象棋(状压dp)
		题目简介 n*m的棋盘,对每行放炮,要求每行每列炮数<=2,求方案数%9999973 N,M<=100 题目分析 算法考虑 考虑到N,M范围较小,每一行状态只与前面的行状态有关,考虑状压D ... 
- 洛谷$P$3160 局部极小值 $[CQOI2012]$ 状压$dp$
		正解:状压$dp$ 解题报告: 传送门! 什么神仙题昂,,,反正我是没有想到$dp$的呢$kk$,,,还是太菜了$QAQ$ 首先看数据范围,一个4×7的方格,不难想到最多有8个局部极小值,过于显然懒得 ... 
- 洛谷 P2473 [SCOI2008]奖励关(状压dp+期望)
		题面 luogu 题解 \(n \leq 15\) 状压 \(f[i][S]\)表示第\(i\)轮,吃过的集合为\(S\) 正着转移好像有点复杂 考虑逆推转移(正着转移应该也行) \(f[i][S]\ ... 
- 洛谷P2761 软件补丁问题 [状压DP,SPFA]
		题目传送门 软件补丁问题 题目描述 T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放了一批共 m 个补丁程序.每一个补丁程序都有其特定的适用环境,某个补丁只有在软件中包含某些错误而同时又 ... 
随机推荐
- 从武侠中的兵器看待数据访问工具——Hibernate Spring.Data Mybatis
			<泪痕剑>第31集,卓爷大谈自己的兵器,我从中摘录,觉得非常受用. “你错了,我们和武器之间的关系,就好像选择情人一样,不管是否擅长,都要用感情. 我少年时候用刀,青年时候仍用刀,不知道用 ... 
- Gradle快速上手——从Maven到Gradle
			[本文写作于2018年7月5日] 本文适合于有一定Maven应用基础,想快速上手Gradle的读者. 背景 Maven.Gradle都是著名的依赖管理及自动构建工具.提到依赖管理与自动构建,其重要性在 ... 
- linux 命令自动补全包
			linux 其他知识目录 rhel7如果使用最小化安装后,tab键默认是不能自动补全命令的 执行yum install bash-completion之后重启系统正常. 
- IT工具使用
			linux 其他知识目录 常用快捷键总结 博客view code 删除,先删除,再清除格式 
- netty初认识
			Netty是什么? 本质:JBoss做的一个Jar包 目的:快速开发高性能.高可靠性的网络服务器和客户端程序 优点:提供异步的.事件驱动的网络应用程序框架和工具 通俗的说:一个好使的处理Socket的 ... 
- Yii2 yii\helpers\ArrayHelper
			yii\helpers\ArrayHelper 是一个数组辅助类,提供额外的数组功能函数 toArray($object, $properties = [], $recursive = true) C ... 
- Chrome 鲜为人知的秘籍(内部协议)&&Chrome功能指令大全
			楼主以 Chrome 版本 39.0.2171.95 m 为例,耗费2小时的记录: chrome://accessibility 用于查看浏览器当前访问的标签,打开全局访问模式可以查看:各个标签页面的 ... 
- USACO 1.5.4 Checker Challenge跳棋的挑战(回溯法求解N皇后问题+八皇后问题说明)
			Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ... 
- python knn自我实践
			#得到分类数据和测试数据 import pymysql import struct from numpy import * a=['']*20 #存图像 分类数据 b=[[0]*76800]*20#存 ... 
- [CF] Sasha and One More Name
			题目大意 就是给一个回文串,然后进行k次分割,产生k+1个字符子串,通过重新组合这k+1个字符字串,是否会出现新的不同的回文串,且最少需要分割几段.无法产生新的回文串则输出"Impossib ... 
