文章用于本人的刷题整理,如有大佬留下宝贵建议,本人将不胜感激。
题目
https://www.luogu.com.cn/problem/P2356
本题一开始想的方法就是直接暴力枚举。
#include<bits/stdc++.h>
using namespace std;
int n;
int a[1005][1005] = {0};
int ss(int x, int y)
{
int sum = 0;
int k;
for(k=1; k<=n; k++){
if(k==x){
continue;
}
else{
sum += a[k][y];
}
}
for(k=1; k<=n; k++){
if(k==y){
continue;
}
else{
sum += a[x][k];
}
}
return sum;
}
int main(void)
{
cin >> n;
int i,j;
for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
cin >> a[i][j];
}
}
int maxn = 0;
int flag = 0;
for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
if(a[i][j]==0){
flag = 1;
maxn = max(ss(i,j),maxn);
}
}
}
if(flag==0){
cout << "Bad Game!";
}
else{
cout << maxn;
}
}
然而此题可以不用开二维数组,从而减少对空间的占用。
在读取每一个数据的同时,计算各行各列数据相加的总值。并判断该地是否是“容身之地”,若是则在两个数组中分别记录下该地的x和y坐标。
#include<cstdio>
#include<iostream>
using namespace std;
int x[10005]={0},y[10005]={0},n,m,count = 0;
int flag = 0;
int maxn = -1;
int main(){
int hang[1005]={0},lie[1005]={0};
cin >> n;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
scanf("%d",&m);
hang[i] += m;
lie[j] += m;
if(m == 0){
count++;
x[count] = i;
y[count] = j;
flag = 1;
}
}
}
if(flag == 0) printf("Bad Game!\n");
if(flag == 1){
for(int i = 1;i <= count;i++){
if(hang[x[i]] + lie[y[i]] > maxn)
maxn = hang[x[i]] + lie[y[i]];
}
cout << maxn << endl;
}
return 0;
}
注意容身之所的数量不超过10000,所以记录位置的x,y数组大小要稍大于这个范围,而不是1000。