zoukankan      html  css  js  c++  java
  • 牛客练习赛58 C 矩阵消除游戏

    给定一个 (n)(m) 列的矩阵,每个位置有权值 (a_{i,j}),可以进行 (k) 次操作,每次任选一行或一列,将这行(列)的权值全部变为 (0),得分加上这行(列)的权值和,求最大得分

    Solution

    考虑到 (n,m) 很小,暴力枚举消除哪些行,然后对列贪心

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 20;
    int n,m,k,a[N][N],b[N][N],c[N],d[N],ans;
    
    
    signed main() {
        cin>>n>>m>>k;
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=m;j++) {
                cin>>b[i][j];
            }
        }
        for(int i=0;i<(1<<n);i++) {
            memset(c,0,sizeof c);
            for(int j=1;j<=n;j++) c[j]=(i>>(j-1))&1;
            int tmp = __builtin_popcount(i), sum=0;
            if(tmp>k) continue;
            memcpy(a,b,sizeof b);
            for(int j=1;j<=n;j++) if(c[j]) {
                for(int k=1;k<=m;k++) sum+=a[j][k], a[j][k]=0;
            }
            memset(d,0,sizeof d);
            for(int j=1;j<=n;j++) {
                for(int k=1;k<=m;k++) d[k]+=a[j][k];
            }
            sort(d+1,d+m+1);
            reverse(d+1,d+m+1);
            for(int j=1;j<=min(m,k-tmp);j++) sum+=d[j];
            ans=max(ans,sum);
        }
        cout<<ans;
    }
    
  • 相关阅读:
    个人总结11
    进度条4,5
    对vivo自带输入法的评价
    个人总结10
    hdu5589Tree
    HDU5213 Lucky
    2018icpcShenYangE
    bzoj3683: Falsita
    cf396C. On Changing Tree
    cf600E. Lomsat gelral
  • 原文地址:https://www.cnblogs.com/mollnn/p/12380543.html
Copyright © 2011-2022 走看看