1625 夹克爷发红包

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;
const int MAXN = 11;
const int MAXM = 201;
ll money[MAXN][MAXM];
ll row[MAXN];
vector<ll> rowSum;
vector<ll> colSum;
vector<ll> high;
int getCount(int num){
	int ret = 0;
	while(num){
		if(num & 1){
			ret++;
		}
		num >>= 1;
	}
	return ret;
}
int main(){
	ll n, m, x, k, sum = 0;
	ios::sync_with_stdio(false);
	cin >> n >> m >> x >> k;
	rowSum.resize(n, 0);
	colSum.resize(m, 0);
	high.resize(m, 0);
	for(int i = 0; i < n; ++i){
		for(int j = 0; j < m; ++j){
			cin >> money[i][j];
			rowSum[i] += money[i][j];
			colSum[j] += money[i][j];
			sum += money[i][j];
		}
	}
	ll rowMax = 1ll * x * m;
	ll colMax = 1ll * x * n;
	ll ans = sum;
	for(int i = 0; i < (1 << n ); ++i){
		ll ret = sum;
		int index = 0;
		int cnt = getCount(i);
		if(k < cnt)	continue;
		for(int j = 0; j < n; ++j){
			if(i & (1 << j)){
				ret += rowMax - rowSum[j];
				row[index++] = j; 
			}
		}
		for(int j = 0; j < m; ++j){
			high[j] = colMax - colSum[j];
			for(int l = 0; l < index; ++l){
				high[j] += money[row[l]][j] - x;
			} 
		}
		sort(high.begin(), high.end(), greater<ll>());
		for(int j = 0; j + cnt < k && high[j] > 0; ++j){
			ret += high[j];
		}
		ans = max(ans, ret);
	}
	cout << ans;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37691414/article/details/80445336