Moovie Mooving(状压DP)

Moovie Mooving

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


题目:

n部电影,有时长和若干放映起始时间。Bessie可以在某部电影的放映阶段去看这部电影或中途离开。他不会看同一部电影2次。问Bessie最少需要看几部电影使得他在0~L时间段内一直看电影。(n最大20)


做法:

状压DP。 表示在状态下Bessie能连续看电影到的最远时间。是二进制状态。第i位为1表示第i部电影已经看过,0表示没看过。转移的时候就找一个中的一个0将它置1。表示下一部要看的电影就是它。然后在这部电影的放映时间vector中二分第一个比当前时间小的放映时间。用+电影时长更新就好了。
转移:
统计最少的电影数量:


代码:

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false), cin.tie(0)
#define debug(a) cout << #a ": " << a << endl
using namespace std;
typedef long long ll;
const int N = 21;
const int inf = 0x3f3f3f3f;
int movie_time[N], dp[1<<N];
vector<int> movie_begin[N];
int get(int id, int x){
    int p = upper_bound(movie_begin[id].begin(), movie_begin[id].end(), x) - movie_begin[id].begin();
    if (p == 0) return 0;
    return movie_begin[id][p-1]+movie_time[id];
}
int cntbit(int sta){
    int cnt = 0;
    for (int i = sta; i >= 1; i -= i&(-i)) cnt++;
    return cnt;
}
int main(void){ 
    IOS;
    int n, L; cin >> n >> L;
    for (int i = 1; i <= n; ++i){
        cin >> movie_time[i];
        int m; cin >> m;
        for (int j = 1; j <= m; ++j){
            int x; cin >> x;
            movie_begin[i].push_back(x);
        }
    }
    for (int i = 1; i <= n; ++i){
        if (movie_begin[i][0] == 0) dp[1<<(i-1)] = movie_time[i];
    }
    int ans = inf;
    for (int i = 1; i < (1<<n); ++i){
        if (dp[i] >= L) ans = min(ans, cntbit(i));
        for (int j = 0; j < n; ++j){
            if (((i>>j)&1) == 0){
                dp[i|(1<<j)] = max(dp[i|(1<<j)], get(j+1, dp[i]));
            }
        }
    }
    if (ans == inf) ans = -1;
    cout << ans << endl;
    return 0;
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# AI面会问哪些问题? #
24273次浏览 477人参与
# 中国电信笔试 #
30906次浏览 283人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
13963次浏览 208人参与
# 你的实习产出是真实的还是包装的? #
18506次浏览 329人参与
# 如果秋招能重来,我会____ #
96446次浏览 499人参与
# 春招至今,你的战绩如何? #
59052次浏览 535人参与
# 厦门银行科技岗值不值得投 #
7393次浏览 185人参与
# i人适合做什么工作 #
36645次浏览 123人参与
# 我是面试官,请用一句话让我破防 #
79291次浏览 219人参与
# 哪些公司真双非友好? #
69118次浏览 287人参与
# 找AI工作可以去哪些公司? #
7433次浏览 177人参与
# 从事AI岗需要掌握哪些技术栈? #
7415次浏览 234人参与
# 五一之后,实习真的很难找吗? #
102790次浏览 584人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
339675次浏览 2163人参与
# 你做过最难的笔试是哪家公司 #
29371次浏览 179人参与
# 你小时候最想从事什么职业 #
159824次浏览 2072人参与
# 阿里笔试 #
175887次浏览 1299人参与
# 金三银四,你的春招进行到哪个阶段了? #
21389次浏览 274人参与
# 一张图晒出你司的标语 #
3777次浏览 71人参与
# 面试被问期望薪资时该如何回答 #
382420次浏览 2163人参与
# 晶盛机电求职进展汇总 #
35209次浏览 318人参与
# 应届生第一份工资要多少合适 #
20439次浏览 84人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务