➤ Problem Link : 741B. Arpa's weak amphitheater and Mehrdad's valuable Hoses
✅ C++ Solution :
#include<bits/stdc++.h> using namespace std; #define ll long long int int parent[1001]; int find(int v) { if(parent[v]==v) return v; return parent[v]=find(parent[v]); } int main() { int n,m,w,x,y,a,b; cin>>n>>m>>w; pair<int,ll> hose[n+1]; // vector<int> adj[n+1]; // bool visited[n+1]; // memset(visited,0,sizeof(visited)); for(int i=1;i<=n;i++) cin>>hose[i].first; for(int i=1;i<=n;i++) cin>>hose[i].second; for(int i=1;i<=n;i++) parent[i]=i; for(int i=1;i<=m;i++) { cin>>x>>y; a=find(x); b=find(y); if(a!=b) parent[b]=a; } int k=0; unordered_map<int,int> mp; for(int i=1;i<=n;i++) { parent[i]=find(i); if(parent[i]==i) mp[i]=++k; } vector<int> comp[k+1]; for(int i=1;i<=n;i++) comp[mp[parent[i]]].push_back(i); /* for(int i=1;i<=k;i++) { cout<<i<<" "; for(int j : comp[i]) cout<<j<<" "; cout<<endl; }*/ ll dp[k+1][w+1]; memset(dp,0,sizeof(dp)); vector<int> v; ll sumW,sumB; ll ans=0; for(int p=1;p<=k;p++) { v = comp[p]; sumW=0,sumB=0; for(int i=0;i<v.size();i++) { for(int j=1;j<=w;j++) { if(p==1 && hose[v[i]].first<=j) { dp[1][j]=max(dp[1][j],hose[v[i]].second); } else if(p!=1) { dp[p][j]=max(dp[p][j],dp[p-1][j]); if (hose[v[i]].first<=j) dp[p][j]=max(dp[p][j],hose[v[i]].second+dp[p-1][j-hose[v[i]].first]); } ans=max(ans,dp[p][j]); } sumW+=hose[v[i]].first; sumB+=hose[v[i]].second; } for(int j=1;j<=w;j++) { if(p==1 && sumW<=j) { dp[1][j]=max(dp[1][j],sumB); } else if(p!=1) { dp[p][j]=max(dp[p][j],dp[p-1][j]); if (sumW<=j) dp[p][j]=max(dp[p][j],sumB+dp[p-1][j-sumW]); } ans=max(ans,dp[p][j]); } /* for(int j=0;j<=w;j++) cout<<dp[p][j]<<" "; cout<<endl; */ } cout<<ans; }
Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook.
😇Happy Learning!!
➤ Problem Link : 741B. Arpa's weak amphitheater and Mehrdad's valuable Hoses
✅ C++ Solution :
#include<bits/stdc++.h> using namespace std; #define ll long long int int parent[1001]; int find(int v) { if(parent[v]==v) return v; return parent[v]=find(parent[v]); } int main() { int n,m,w,x,y,a,b; cin>>n>>m>>w; pair<int,ll> hose[n+1]; // vector<int> adj[n+1]; // bool visited[n+1]; // memset(visited,0,sizeof(visited)); for(int i=1;i<=n;i++) cin>>hose[i].first; for(int i=1;i<=n;i++) cin>>hose[i].second; for(int i=1;i<=n;i++) parent[i]=i; for(int i=1;i<=m;i++) { cin>>x>>y; a=find(x); b=find(y); if(a!=b) parent[b]=a; } int k=0; unordered_map<int,int> mp; for(int i=1;i<=n;i++) { parent[i]=find(i); if(parent[i]==i) mp[i]=++k; } vector<int> comp[k+1]; for(int i=1;i<=n;i++) comp[mp[parent[i]]].push_back(i); /* for(int i=1;i<=k;i++) { cout<<i<<" "; for(int j : comp[i]) cout<<j<<" "; cout<<endl; }*/ ll dp[k+1][w+1]; memset(dp,0,sizeof(dp)); vector<int> v; ll sumW,sumB; ll ans=0; for(int p=1;p<=k;p++) { v = comp[p]; sumW=0,sumB=0; for(int i=0;i<v.size();i++) { for(int j=1;j<=w;j++) { if(p==1 && hose[v[i]].first<=j) { dp[1][j]=max(dp[1][j],hose[v[i]].second); } else if(p!=1) { dp[p][j]=max(dp[p][j],dp[p-1][j]); if (hose[v[i]].first<=j) dp[p][j]=max(dp[p][j],hose[v[i]].second+dp[p-1][j-hose[v[i]].first]); } ans=max(ans,dp[p][j]); } sumW+=hose[v[i]].first; sumB+=hose[v[i]].second; } for(int j=1;j<=w;j++) { if(p==1 && sumW<=j) { dp[1][j]=max(dp[1][j],sumB); } else if(p!=1) { dp[p][j]=max(dp[p][j],dp[p-1][j]); if (sumW<=j) dp[p][j]=max(dp[p][j],sumB+dp[p-1][j-sumW]); } ans=max(ans,dp[p][j]); } /* for(int j=0;j<=w;j++) cout<<dp[p][j]<<" "; cout<<endl; */ } cout<<ans; }
Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook.
😇Happy Learning!!