how is this ensuring that whole group sits together?
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
#define vi vector<int>
#define rep(i, l, r) for(int i = l; i<r; i++)
unordered_map<int,int> pref;
int solve(int ind, int mask, vi &a, vi &b, int n, int m, vector<vi> &dp){
if (mask == (1<<m) - 1) return 0;
if (ind == a.size() + 1) return -1e9;
int maxi = 0;
if (dp[ind][mask] != -1) return dp[ind][mask];
maxi = max(maxi, solve(ind+1, mask, a, b, n, m, dp));
for(int i=0; i<m; i++){
if (mask & (1 << i)) continue;
if (ind+b[i] > n) return -1e9;
int cost = pref[b[i]+ind-1] - pref[ind-1];
int f = cost + solve(ind+b[i], mask|(1<<i), a, b, n, m, dp);
maxi = max(maxi, f);
}
return dp[ind][mask] = maxi;
}
int32_t main(){
int n,m;
cin>>n>>m;
vector<int> a(n);
rep(i,0,n) cin>>a[i];
vi b(m);
rep(i,0,m) cin>>b[i];
for(int i=0; i<n; i++){
pref[i] = pref[i-1] + a[i];
}
pref[-1] = 0;
vector<vector<int>> dp(n, vector<int>(1<<m, -1));
cout << solve(0, 0, a, b, n, m, dp) << endl;
return 0;
}
This is my answer for question 2 according to me.
I applied basic bitmask dp. To calculate the sum (basically the profit for the owner), i just used a prefix map
For Question no. 1:-
I think we can apply Bitmask DP because constraints on M is small (<=13)
So basically, Firstly we have to make a prefix sum array of the costs of seat.
Create DP[N][Mask] table where Dp[I][mask] will tell the maximum profit, which can be created by assigning seats index=i to n such that "mask" groups are already assigned seats.
Transitions:-
at each index, we have 2 options:-
i) Leave this seat i.e. Assign to no group
=> dp[I][mask]= 0+fun(i+1,mask)
ii) Assign to some group that has not been assigned yet. It can be checked from the mask by iterating over all groups (max iterations<=13)
=> dp[I][mask]= profit by assigning (can be calculated from prefix array in O(1) )+fun(i+1, mask|curr_group )
So, take the option which is more profitable
Ans will be stored as dp[0][0]
Time complexity:-
O(2^13 * N * 13), I think it should pass
Dungeons and Dragons
#include <bits/stdc++.h>
using namespace std;
#define ll long long
bool binary_searchh(vector<ll> &dragons,ll n,ll m,ll mid)
{
ll sum=0;
for(int i=0;i<n;i++)
{
sum+=min(mid,dragons[i]);
}
return sum>=m;
}
void solve()
{
ll n,m;
cin>>n>>m;
vector<ll> dragons(n);
for(int i=0;i<n;i++)
cin>>dragons[i];
ll start=0,end=1e9+1;
while(start<end)
{
ll mid=(start+end)/2;
if(binary_searchh(dragons,n,m,mid))
{
end=mid;
}
else
{
start=mid+1;
}
}
ll sum=0;
for(int i=0;i<n;i++)
{
sum+=min(start-1,dragons[i]);
dragons[i]=max((ll)0,dragons[i]-(start-1));
}
while(sum<m)
{
for(int i=0;i<n;i++)
{
if(dragons[i]>0)
{
dragons[i]--;
sum++;
}
if(sum==m)
break;
}
}
for(int i=0;i<n;i++)
{
cout<<dragons[i]<<" ";
}
cout<<"\n";
}
int main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}
public static void main(String args[]) throws IOException {
int n=in.nextInt();
int m=in.nextInt();
int a[]=in.readintarray(n);
int b[]=in.readintarray(m);
Arrays.sort(a);
Arrays.sort(b);
long sum=0;
for(int i=n-1;i>=0;i--){
if(m==0)break;
sum+=a[i];
m--;
}
print(sum);
}
will the first question be in this way can anyone share a test case?
#include<bits/stdc++.h>
#define endl "\n"
#define ff first
#define ss second
#define int long long
typedef long long ll;
typedef long double ld;
using namespace std;
#ifndef ONLINE_JUDGE
#include "include/debug.h"
#else
#define debugarr(a, n) 42
#define debug(...) 42
#endif
void code(int TC){
int n, m; cin >> n >> m;
vector<vector<pair<int, int>>> G(n + 5);
vector<int> a(n + 5);
for(int i = 1; i <= n; i++) cin >> a[i];
for(int j = 0; j < m; j++){
int u, v; cin >> u >> v;
G[u].push_back({v, j});
G[v].push_back({u, j});
}
int all = accumulate(a.begin(), a.end(), 0ll);
vector<int> p(n + 1), sz(n + 5, 1), s(a.begin(), a.end());
iota(p.begin(), p.end(), 0);
function<int(int)> getpar = [&](int u){
if(u == p[u]) return u;
return p[u] = getpar(p[u]);
};
function<void(int, int)> merge = [&](int u, int v){
u = getpar(u), v = getpar(v);
if(u != v){
if(sz[u] < sz[v]) swap(u, v);
if(sz[u] == sz[v] && v < u) swap(u, v);
p[v] = u, sz[u] += sz[v], s[u] += s[v];
}
};
int id = 0;
vector<int> I(n + 5);
function<void(int, int)> dfs = [&](int u, int edge){
for(auto [v, e] : G[u]){
if(e == edge) continue;
if(I[v]){
I[u] = min(I[u], I[v]);
merge(u, v);
continue;
}
I[v] = ++id;
dfs(v, e);
I[u] = min(I[v], I[u]);
if(I[u] == I[v]) merge(u, v);
}
};
I[1] = ++id;
dfs(1, -1);
debug(p);
vector<vector<int>> T(n + 5);
vector<set<int>> ap(n + 5);
for(int i = 1; i <= n; i++){
for(auto [v, e] : G[i]){
if(getpar(i) != getpar(v)) T[getpar(i)].push_back(getpar(v)), ap[getpar(i)].insert(i);
}
}
vector<int> sum(n + 5);
int ansa = 0, ansb = 0;
for(int i = 1; i <= n; i++) p[i] = getpar(i);
function<void(int, int)> calc = [&](int u, int par){
int cur = s[u];
for(auto v : T[u]){
if(v == par) continue;
calc(v, u);
cur += sum[v];
}
sum[par] = all - cur;
for(auto art : ap[u]){
vector<int> V;
int now = 0;
for(auto [v, e] : G[art]){
if(p[v] != u) V.push_back(sum[p[v]]), now += sum[p[v]];
}
V.push_back(all - now - a[art]);
int k = V.size();
sort(V.begin(), V.end());
if(k == 1){
if(ansa == 0) ansb = max(ansb, V[0]);
}
else if(V[k - 2] > ansa) ansa = V[k - 2], ansb = V[k - 1];
else if(V[k - 2] == ansa && ansb < V[k - 2]) ansb = V[k - 2];
}
sum[par] = 0;
sum[u] = cur;
};
calc(p[1], 0);
cout << ansa << " " << ansb << endl;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);cerr.tie(0);
cout.precision(30);
int TT = 1; cin >> TT;
for (int TC = 1; TC <= TT; TC++)
code(TC);
return 0;
}