题目链接:https://ac.nowcoder.com/acm/problem/241584
#include <bits/stdc++.h>
using namespace std;
vector<int> v[30];
int d[30], f[1<<22];
int slove(int i, int t){
int L=0, R=v[i].size()-1, k=-1;
while(L<=R){
int mid=(L+R)/2;
if(v[i][mid]<=t){
k=mid;
L=mid+1;
}
else{
R=mid-1;
}
}
if(k==-1) return t;
return max(int(v[i][k]+d[i]), t);
}
int main(){
int n, L; scanf("%d%d", &n, &L);
for(int i=1; i<=n; i++){
scanf("%d", &d[i]);
int m, x; scanf("%d", &m);
for(int k=1; k<=m; k++){
scanf("%d", &x);
v[i].push_back(x);
}
}
f[0]=0;
int Min=30;
for(int s=0; s<(1<<n); s++){
for(int i=0; i<n; i++){
if(((s>>i)&1)){
f[s]=max(f[s], slove(i+1, f[s^(1<<i)]));
}
}
if(f[s]>=L){
int ans=0;
for(int i=0; i<n; i++){
if((s>>i)&1){
ans++;
}
}
Min=min(Min, ans);
}
}
if(Min==30){
printf("-1\n");
}
else{
printf("%d\n", Min);
}
return 0;
}

京公网安备 11010502036488号