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

#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%数据,感觉应该是可以的,求大佬们帮忙查查错
全部评论
我也是95,不知道哪里出错了
点赞 回复
分享
发布于 2020-02-28 23:30
已找到错误,提供一组数据hack一下
点赞 回复
分享
发布于 2020-02-29 07:53
联易融
校招火热招聘中
官网直投
3 3 2 1001 1 101 1001 0 101 0 0 0
点赞 回复
分享
发布于 2020-02-29 07:55

相关推荐

3 收藏 评论
分享
牛客网
牛客企业服务