Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define maxn 25
- #define pb push_back
- #define reset(a,gt,n) memset(a,gt,n*4+4)
- int i,j,n,m,k;
- int vc=1e9;
- int a[maxn],w;
- struct ii
- {
- int gt,du;
- };
- ii f[500005];
- int tv[500005];
- vector <int> pos[25];
- void nhap()
- {
- ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- freopen("skyscraper.inp","r",stdin);
- freopen("skyscraper.out","w",stdout);
- cin>>n>>w;
- for(int i=1;i<=n;i++) cin>>a[i];
- }
- int get(int s)
- {
- return (1<<s);
- }
- void solve(int s)
- {
- for(int i=1;i<=n;i++)
- {
- int tam=(s^get(i-1));
- if(tam<s)
- {
- if(a[i]+f[tam].du<=w)
- {
- if( f[s].gt > f[tam].gt || ( f[s].gt==f[tam].gt && f[s].du > f[tam].du+a[i] ) )
- {
- f[s].gt=f[tam].gt; f[s].du=f[tam].du+a[i];
- tv[s]=i;
- }
- }
- else
- {
- if(f[s].gt > f[tam].gt+1 || ( f[s].gt==f[tam].gt+1 && f[s].du > a[i] ) )
- {
- f[s].gt=f[tam].gt+1; f[s].du=a[i];
- tv[s]=i;
- }
- }
- }
- }
- }
- void xuli()
- {
- f[0]={0,vc};
- for(int i=1;i<get(n);i++)
- {
- f[i]={vc,vc};
- solve(i);
- }
- cout<<f[get(n)-1].gt<<endl;
- int u=get(n)-1;
- while(true)
- {
- if(u==0) break;
- int res=tv[u];
- pos[f[u].gt].pb(res);
- u=u^get(res-1);
- }
- for(int i=1;i<= f[get(n)-1].gt ;i++)
- {
- cout<<pos[i].size()<<' ';
- for( int v : pos[i] ) cout<<v<<' ';
- cout<<endl;
- }
- }
- int main()
- {
- nhap();
- xuli();
- }
Add Comment
Please, Sign In to add comment