741B. Arpa's weak amphitheater and Mehrdad's valuable Hoses - Codeforces Solution C++

  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!!