洛谷U14667 肝活动【比赛】 【状压dp】
来源:互联网 发布:中国网络发展史插画 编辑:程序博客网 时间:2024/04/29 07:59
题目描述
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 .
输入输出样例
3 2 10BokutachiwaHitotsunoHikari 3 8Korekara 1 2SnowHalation 2 5
6SnowHalationBokutachiwaHitotsunoHikariKorekara
2 1 2AoizoraJumpingHeart 1 2TimeLapse 2 4
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】
- [DP][rqnoj72]拔河比赛
- poj象棋比赛(DP)
- 滑雪比赛(记忆dp)
- 【DP】[NOI2011]智能车比赛
- 大观楼第一天划船比赛日 活动现场回顾
- 江苏科技大学课题研究小组“FlySpiders”第一次比赛活动
- Poj 3071 Football (比赛对阵 概率DP)
- 1959 拔河比赛[DP][随机化贪心※]
- “玲珑杯”ACM比赛 Round #12【dp】
- zoj1076 Gene Assembly 活动安排 dp
- njupt 1163 活动安排问题 dp+二分
- BNUOJ 51280 组队活动(dp + 计数)
- 51nod 活动安排问题 《贪心+dp》
- 洛谷 比赛题解
- 洛谷 P1626 象棋比赛
- 【洛谷】P1626象棋比赛
- 洛谷 比赛 有感
- g++命令用法介绍
- Boost-QT兼容问题:#define FUSION_HASH #
- SharedPreferences 存List集合,模拟数据库,随时存取
- 杂谈
- LINUX ACL 学习笔记
- 洛谷U14667 肝活动【比赛】 【状压dp】
- 括号配对问题 ACM 数据结构
- JS —— 事件 Event
- TopK---返回第K小(大)的数字
- 数组去重总结
- 2017.10.28 C组比赛总结
- 几个常用的定制类函数
- java判断访问设备类型
- 设计模式--工厂模式