集训 T2-监考老师

大致题意:

  • 找出一个位置可以选出最大的"横排总和+竖列总和"。

基本思路

  • 利用前缀和的思想在读入的时候把每一列每一行的总和都算出来,
  • 然后暴力枚举每一个点,每一个点的答案就是这一行和这一列的和,
  • 最后找出最大的。

Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
using namespace std;
#define R read()
#define GC getchar()
#define ll long long
#define ull unsigned long long
#define INF 0x7fffffff
#define LLINF 0x7fffffffffffffff
ll read(){
    ll s=0,f=1;
    char c=GC;
    while(c<'0'||c>'9'){if(c=='-')f=-f;c=GC;}
    while(c>='0'&&c<='9'){s=s*10+c-'0';c=GC;}
    return s*f;
}
void fre(){
    freopen("teacher.in","r",stdin);
    freopen("teacher.out","w",stdout);
}
int n,m;
int mp[110][110];
int x[110],y[110];//x[i]表示第i行的总和,y[i]表示第i列的总和
int ans;
int main(){
    fre();
    n=R;m=R;
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            mp[i][j]=R;//读入
            x[i]+=mp[i][j];//记录第i行的总和
            y[j]+=mp[i][j];//记录第i列的总和
        }
    }
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){//暴力枚举每一个点
            ans=max(ans,x[i]+y[j]);//找出最大的
        }
    }
    printf("%d",ans);//输出
    return 0;
}
原文地址:https://www.cnblogs.com/FUXyao/p/12905917.html