弹珠游戏--嘴平乔治猪的刷题整理

文章用于本人的刷题整理,如有大佬留下宝贵建议,本人将不胜感激。

题目
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。

上一篇:贪心算法


下一篇:1005