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