交上去之后第一个点就WA掉了,剩下全部RE。第一个点数据(也就是样例)在本地跑和你谷IDE上跑答案都是对的,但是交上去之后看错误信息好像输出的是-1。
Code
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#include <random>
#define int long long
#define double long double
#define p1(x) x.first
#define p2(x) x.second
#define i128 __int128_t
//#pragma GCC optimize(2)
#define w(x) w[x]
#define lz(x) lz[x]
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
#define pii pair<int,int>
using namespace std;
int n,L;
set<int>s[30];
int len[30];
int dp[1<22];
inline int ppc(int x){
int res=0;
while(x)res+=x&1,x>>=1;
return res;
}
signed main(){
ios::sync_with_stdio(0);
//freopen("/Users/liuyile/Downloads/P5123_2.in","r",stdin);
//freopen("","w",stdout);
cin>>n>>L;
for(int i=0;i<n;i++){
cin>>len[i];
int c=0;
cin>>c;
for(int j=1;j<=c;j++){
int x;
cin>>x;
s[i].insert(x);
}
}
int N=1<<n;
//return 0;
int res=n+1;
for(int i=1;i<N;i++){
for(int j=0;j<n;j++)
if((1<<j)&i){
int tmp=(1<<j)^i;
auto it=s[j].upper_bound(dp[tmp]);
if(it==s[j].begin())continue;
it--;
dp[i]=max(dp[i],max(dp[tmp],*it+len[j]));
}
if(dp[i]>=L)res=min(res,ppc(i));
//cout<<i<<" "<<dp[i]<<" "<<ppc(i)<<endl;
}
if(res==n+1)cout<<-1<<endl;
else cout<<res<<endl;
return 0;
}