• P3118 [USACO15JAN]Moovie Mooving G 状压DP + 二分


    P3118 [USACO15JAN]Moovie Mooving G

    题目链接

    ​ 状压DP + 二分。

    ​ 由于电影的数目很小,并且每个电影只能看一次,我们可以用二进制状压,第(i - 1)位为0/1代表第(i)个电影没看/看了。

    (f[s])表示在状态(s)下,最多可以从0连续看到多长时间。

    ​ 然后枚举状态(s)的每一个1,去掉这个1会得到一个新的状态(s1),设当前1的位置为(j),我们要找一个小于等于(f[s1])的最大的一个开始时间,然后转移:(f[i] = max(f[i], a[j][tmp] + len[j]);)(tmp)表示找到的最大的开始时间的编号,(len)表示电影(j)的时长)。

    (sum[s])是统计答案用的,代表达到状态(s)得看的电影数,s ^ (s & -s)是除去最后一个1的电影数,然后如果(f[s] >= l)说明这个状态可以被统计到答案里面,然后更新答案。

    #include <bits/stdc++.h>
    
    using namespace std;
    
    inline long long read() {
    	long long s = 0, f = 1; char ch;
    	while(!isdigit(ch = getchar())) (ch == '-') && (f = -f);
    	for(s = ch ^ 48;isdigit(ch = getchar()); s = (s << 1) + (s << 3) + (ch ^ 48));
    	return s * f;
    }
    
    const int N = 25;
    int n, l, ans;
    int f[1 << 20], num[N], sum[N], len[N], a[N][1005];
    
    int find(int x, int p) {
    	int l = 1, r = num[p];
    	int res = 0;
    	while(l <= r) {
    		int mid = (l + r) >> 1;
    		if(a[p][mid] <= x) res = mid, l = mid + 1;
    		else r = mid - 1;
    	}
    	return res;
    }
    
    int main() {
    	
    	n = read(); l = read();
    	for(int i = 1;i <= n; i++) {
    		len[i] = read(); num[i] = read();
    		for(int j = 1;j <= num[i]; j++) a[i][j] = read();
    	}
    	
    	ans = 1e9;
    	for(int i = 1;i <= (1 << n) - 1; i++) {
    		for(int j = 1;j <= n; j++) {
    			if(i & (1 << (j - 1))) {
    				int tmp = find(f[i ^ (1 << (j - 1))], j);
    				if(tmp != 0) f[i] = max(f[i], a[j][tmp] + len[j]);
    			}
    		}
    	}
    
    	for(int i = 1;i <= (1 << n) - 1; i++) {
    		sum[i] = sum[i ^ (i & (-i))] + 1;
    		if(f[i] >= l) ans = min(ans, sum[i]);  
    	}
    	
    	printf("%d", ans == 1e9 ? -1 : ans);
    	
    	fclose(stdin); fclose(stdout);
    	return 0;
    }
    
    
    
  • 相关阅读:
    c++类中的常量
    什么是租赁
    期末结转销售成本结算利润
    合并报表抵消分录借:营业成本 贷:存货怎么理解(自己分析)
    电脑上装安卓系统
    下载apps from google play on windows 10
    virtualbox找不到ubuntu64选项
    如何区分其他综合收益和当期损益
    哪些项目进其他综合收益
    境外经营财务报表的折算方法
  • 原文地址:https://www.cnblogs.com/czhui666/p/13658829.html
Copyright © 2020-2023  润新知