题目链接: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;
}