竞赛讨论区 > 仅枚举一次行列的值,后续随着取值更新权值
头像
adobeStu
发布于 2020-02-28 22:25
+ 关注

仅枚举一次行列的值,后续随着取值更新权值

#include <bits/stdc++.h>
using namespace std;
const int maxn=15;
int mp[maxn][maxn];
int n,m,k;
int ans;
int h[maxn],l[maxn];
vector<int> q;
bool cmp(int a,int b){
    return a>b;
}
int main(){
    while(cin>>n>>m>>k){
        int ans=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cin>>mp[i][j];
            }
        }
        memset(h,0,sizeof(h));
        memset(l,0,sizeof(l));
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                h[i]+=mp[i][j];
            }
            q.push_back(h[i]);
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                l[i]+=mp[j][i];
            }
            q.push_back(l[i]);
        }
        if(k>=n || k>=m){
            for(int i=0;i<n;i++){
                for(int j=0;j<m;j++){
                    ans+=mp[i][j];
                }
            }
            cout<<ans<<endl;
            continue;
        }

        //0~n-1 行,n~m-1列
        while(k--){
            int maxi=0,maxx=0;
            for(int i=0;i<q.size();i++){
                if(q[i]>maxx){ maxi=i;
                    maxx=q[i];
                }
            }
            ans+=maxx; q[maxi]=0;
            if(maxi>n-1){
                for(int i=0;i<n;i++){
                    q[i]-=mp[i][maxi-n];
                }
            }
            if(maxi<=n-1){
                for(int i=n;i<q.size();i++){
                    q[i]-=mp[maxi][i-n];
                }
            }
        }
        cout<<ans<<endl;
    }
     
     
    return 0;
}
不知道为什么只过了95%数据,感觉应该是可以的,求大佬们帮忙查查错

全部评论

(3) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐