【每日一题】Moovie Mooving

Moovie Mooving

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

题意

有 N 部电影,每部电影有不同的放映时常,和若干个放映起始时间。
Bessie 可以在一部电影播放过程中的任何时间进入或退出放映厅。每部电影她最多看1次且她不能在看一部电影的过程中,换到另一个正在播放相同电影的放映厅。

Bessie 能不能从0到L分钟连续不断地观看电影?如果能,计算她最少看几部电影。

solution

只有20考虑状压dp, 表示完成 集合需要的最长时间,假设 集合最后看的一部电影为 ,那么 ^ 转移过来,并二分选取小于转移前集合的电影 的最晚放映时间来更新 ,同时维护 的最小集合为答案。时间复杂度

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 22;
int n, l, t[N], dp[1 << N];
vector<int> g[N];
int main() {
  cin >> n >> l;
  for (int i = 0; i < n; i++) {
    int c, x;
    cin >> t[i] >> c;
    while (c--) {
      cin >> x;
      g[i].push_back(x);
    }
    g[i].push_back(l);
  }
  int res = n + 1;
  for (int i = 1; i < (1 << n); i++) {
    for (int j = 0; j < n; j++) {
      if ((i >> j) & 1) {
        int now = i ^ (1 << j);
        int pos =
            upper_bound(g[j].begin(), g[j].end(), dp[now]) - g[j].begin() - 1;
        if (pos >= 0 && g[j][pos] + t[j] > dp[now])
          dp[i] = max(dp[i], g[j][pos] + t[j]);
      }
    }
    if (dp[i] >= l) res = min(res, __builtin_popcount(i));
  }
  if (res == n + 1)
    puts("-1");
  else
    cout << res << '\n';
  return 0;
}
全部评论

相关推荐

06-25 16:00
武汉大学 Java
工科研究生底薪工资就开3k啊??
机械打工仔:写文章提成的岗位工资低,你怪工科?
点赞 评论 收藏
分享
05-14 20:34
门头沟学院 Java
窝补药贝八股:管他们,乱说,反正又不去,直接说680
点赞 评论 收藏
分享
06-17 00:26
门头沟学院 Java
程序员小白条:建议换下项目,智能 AI 旅游推荐平台:https://github.com/luoye6/vue3_tourism_frontend 智能 AI 校园二手交易平台:https://github.com/luoye6/vue3_trade_frontend GPT 智能图书馆:https://github.com/luoye6/Vue_BookManageSystem 选项目要选自己能掌握的,然后最好能自己拓展的,分布式这种尽量别去写,不然你只能背八股文了,另外实习的话要多投,尤其是学历不利的情况下,多找几段实习,最好公司title大一点的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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