f[i]表示用i集合内的电影可以达到的最长时间

f[i]向f[i|(1<<j)]更新,此时的时间为第j部电影在f[i]前的最晚上映时间

先排序一遍离散化后用前缀最大值解决

时间复杂度$O(n2^n)$

#include<cstdio>
#include<algorithm>
const int N=20,M=40010;
int n,l,i,j,c,d[N],g[N][M],m,q[M],id[M],t[M],f[1<<N],ans=M;
inline bool cmp(int x,int y){return t[x]<t[y];}
inline void min(int b){if(ans>b)ans=b;}
inline void max(int&a,int b){if(a<b)a=b;}
inline int lower(int x){
int l=1,r=m,mid,t;
while(l<=r)if(::t[q[mid=(l+r)>>1]]>=x)r=(t=mid)-1;else l=mid+1;
return t;
}
int main(){
for(scanf("%d%d",&n,&l);i<n;i++)for(scanf("%d%d",&d[i],&c);c--;id[++m]=i,t[m]=j,id[++m]=-1,t[m]=j+d[i])scanf("%d",&j);
for(id[++m]=-1,t[m]=l,id[++m]=-1,i=1;i<=m;i++)q[i]=i;
for(std::sort(q+1,q+m+1,cmp),l=lower(l),i=1;i<=m;i++)if(~id[i])g[id[i]][lower(t[i])]=lower(t[i]+d[id[i]]);
for(i=0;i<n;i++)for(j=1;j<=m;j++)if(!g[i][j])g[i][j]=g[i][j-1];
for(f[i=0]=1;i<(1<<n);i++)if(f[i]){
if(f[i]>=l){min(__builtin_popcount(i));continue;}
for(j=0;j<n;j++)if(!(i>>j&1))max(f[i|(1<<j)],g[j][f[i]]);
}
return printf("%d",ans<M?ans:-1),0;
}

  

最新文章

  1. 第一篇:初识bootstrap
  2. STL:原地归并排序模板(InplaceMergeSort)
  3. openldap主机访问控制(基于hostname)
  4. hdu1695 莫比乌斯反演
  5. python中的异常处理
  6. 做一款仿映客的直播App
  7. (转载)OC学习篇之---归档和解挡
  8. QT模态弹出对话框
  9. 当今app行业 比较流行的 简称 汇总
  10. IRP派遣操作
  11. php笔记(八)PHP类与对象之抽象类
  12. Laravel Cache 使用
  13. 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写到 OK-6410A 开发板上
  14. asp.net core 2.1 配置管理
  15. spark-sql将Rdd转换为DataFrame进行操作的两种方法
  16. 基于thinkphp的RBAC权限控制
  17. Delphi XE中String、ANSIString、TBytes之间的转换
  18. 人体感应模块控制LCD1602背景灯是否开启
  19. encodeURIComponent编码反斜杠 \ (正则匹配)
  20. wcf客户端终结点样本集合

热门文章

  1. Item 表单页面的 Select2 相关业务逻辑
  2. 2模02day1题解
  3. fsck检查和修复文件系统
  4. 【Python】Django 如何直接返回404 被 curl,wget 捕获到
  5. EtherCAT报文寻址
  6. sys.path和os.path
  7. Java for LeetCode 146 LRU Cache 【HARD】
  8. Heap:左式堆的应用例(任意序列变单调性最小价值)
  9. Android中如何让手机屏幕不待机
  10. Androidi性能优化之Java代码优化(摘自Android性能优化一书)