牛客练习赛58 矩阵消除游戏
链接:https://ac.nowcoder.com/acm/contest/4090/C
来源:牛客网
备注:
思路
通过二进制来枚举选哪几行几列的情况,维护最大的ans
CODE : 参考雨巨
1 #include <bits/stdc++.h> 2 #define dbg(x) cout << #x << "=" << x << endl 3 #define eps 1e-8 4 #define pi acos(-1.0) 5 6 using namespace std; 7 typedef long long LL; 8 9 template<class T>inline void read(T &res) 10 { 11 char c;T flag=1; 12 while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0'; 13 while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag; 14 } 15 16 namespace _buff { 17 const size_t BUFF = 1 << 19; 18 char ibuf[BUFF], *ib = ibuf, *ie = ibuf; 19 char getc() { 20 if (ib == ie) { 21 ib = ibuf; 22 ie = ibuf + fread(ibuf, 1, BUFF, stdin); 23 } 24 return ib == ie ? -1 : *ib++; 25 } 26 } 27 28 int qread() { 29 using namespace _buff; 30 int ret = 0; 31 bool pos = true; 32 char c = getc(); 33 for (; (c < '0' || c > '9') && c != '-'; c = getc()) { 34 assert(~c); 35 } 36 if (c == '-') { 37 pos = false; 38 c = getc(); 39 } 40 for (; c >= '0' && c <= '9'; c = getc()) { 41 ret = (ret << 3) + (ret << 1) + (c ^ 48); 42 } 43 return pos ? ret : -ret; 44 } 45 46 const int maxn = 50; 47 48 int a[maxn][maxn]; 49 int row[maxn], line[maxn]; 50 bool b[30]; 51 52 LL sum = 0; 53 54 int _count(int x) { 55 memset(b, 0, sizeof(b)); 56 int cnt = 0; 57 int q = 1; 58 while(x) { 59 if (x&1) { 60 cnt++; 61 b[q] = 1; 62 } 63 x >>= 1; 64 q++; 65 } 66 return cnt; 67 } 68 69 int main() 70 { 71 int n,m,k; 72 73 scanf("%d %d %d",&n, &m, &k); 74 for ( int i = 1; i <= n; ++i ) { 75 for ( int j = 1; j <= m; ++j ) { 76 scanf("%d",&a[i][j]); 77 sum += 1ll * a[i][j]; 78 line[i] += a[i][j]; 79 } 80 } 81 if(k >= n && k >= m) { 82 printf("%lld\n",sum); 83 return 0; 84 } 85 k = min(k, min(n, m)); 86 LL ans = 0; 87 int temp = (1 << n); 88 sum = 0; 89 for ( int i = 0; i < temp; ++i ) { 90 int numline = _count(i); 91 sum = 0; 92 int numrow = k - numline; 93 if(numrow > m || numrow < 0) { 94 continue; 95 } 96 for ( int j = 1; j <= n; ++j ) { 97 if(b[j]) { 98 //printf("line[%d]:%d\n",j, line[j]); 99 sum += line[j]; 100 } 101 } 102 memset(row, 0, sizeof(row)); 103 for ( int j = 1; j <= n; ++j ) { 104 for ( int k = 1; k <= m; ++k ) { 105 if(!b[j]) { 106 row[k] += a[j][k]; 107 } 108 } 109 } 110 sort(row + 1, row + m + 1, greater<int>() ); 111 //printf("!sum:%d\n",sum); 112 for ( int j = 1; j <= numrow; ++j ) { 113 //printf("row[%d]:%d\n",j, row[j]); 114 sum += row[j]; 115 } 116 //dbg(sum); 117 //printf("\n"); 118 ans = max(ans, sum); 119 } 120 cout << ans << endl; 121 return 0; 122 }
#include <bits/stdc++.h>
#define dbg(x) cout << #x << "=" << x << endl
#define eps 1e-8
#define pi acos(-1.0)
using namespace std;
typedef long long LL;
template<class T>inline void read(T &res)
{
char c;T flag=1;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
namespace _buff {
const size_t BUFF = 1 << 19;
char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
char getc() {
if (ib == ie) {
ib = ibuf;
ie = ibuf + fread(ibuf, 1, BUFF, stdin);
}
return ib == ie ? -1 : *ib++;
}
}
int qread() {
using namespace _buff;
int ret = 0;
bool pos = true;
char c = getc();
for (; (c < '0' || c > '9') && c != '-'; c = getc()) {
assert(~c);
}
if (c == '-') {
pos = false;
c = getc();
}
for (; c >= '0' && c <= '9'; c = getc()) {
ret = (ret << 3) + (ret << 1) + (c ^ 48);
}
return pos ? ret : -ret;
}
const int maxn = 50;
int a[maxn][maxn];
int row[maxn], line[maxn];
bool b[30];
LL sum = 0;
int _count(int x) {
memset(b, 0, sizeof(b));
int cnt = 0;
int q = 1;
while(x) {
if (x&1) {
cnt++;
b[q] = 1;
}
x >>= 1;
q++;
}
return cnt;
}
int main()
{
int n,m,k;
scanf("%d %d %d",&n, &m, &k);
for ( int i = 1; i <= n; ++i ) {
for ( int j = 1; j <= m; ++j ) {
scanf("%d",&a[i][j]);
sum += 1ll * a[i][j];
line[i] += a[i][j];
}
}
if(k >= n && k >= m) {
printf("%lld\n",sum);
return 0;
}
k = min(k, min(n, m));
LL ans = 0;
int temp = (1 << n);
sum = 0;
for ( int i = 0; i < temp; ++i ) {
int numline = _count(i);
sum = 0;
int numrow = k - numline;
if(numrow > m || numrow < 0) {
continue;
}
for ( int j = 1; j <= n; ++j ) {
if(b[j]) {
//printf("line[%d]:%d\n",j, line[j]);
sum += line[j];
}
}
memset(row, 0, sizeof(row));
for ( int j = 1; j <= n; ++j ) {
for ( int k = 1; k <= m; ++k ) {
if(!b[j]) {
row[k] += a[j][k];
}
}
}
sort(row + 1, row + m + 1, greater<int>() );
//printf("!sum:%d\n",sum);
for ( int j = 1; j <= numrow; ++j ) {
//printf("row[%d]:%d\n",j, row[j]);
sum += row[j];
}
//dbg(sum);
//printf("\n");
ans = max(ans, sum);
}
cout << ans << endl;
return 0;
}