寒假 VJ 训练题1

  

题目链接:

 https://vjudge.net/contest/208482#problem

题目大意:

 给你一个N*M的空间,其中0表示没有人,1表示有人,对应一个好位子以及方向的定义为:

 ①首先这个位子不能有人。

 ②其次对应这个位子安排一个照明方向,这个方向上必须有人才行。

 让你求一共有多少个这样满足的放置方案。

数据范围:

 1 <= n, m <=1000 ;

输入输出格式:

Input
2 4
0 1 0 0
1 0 1 0
Output
9
Input
4 4
0 0 0 0
1 0 0 1
0 1 1 0
0 1 0 0
Output
20

解题思路:

 此题暴力的话会在TLE在第七个样例上;因此要先做预处理,用两个数组sum1,sum2分别存放行的前缀和、列的前缀和。

然后用一层循环判断当a[i][j] == 0 时 :

<1> 判断sum1[i][j] >? 0, sum1[i][m] - sum1[i][j] > ? 0;

<2> 判断sum2[i][j] >? 0, sum2[i][n] - sum2[i][j] > ? 0;

 若大于 0 ,则ans++;

这个题比较坑的一个地方是输入输出使用C++的输入输出流的话还是会TLE, 要换成 scanf()和printf()

因此当我们遇到TLE 时 ,不能忽略这个问题(尽量用scanf() 和 printf()  :  )

AC代码: 

#include <bits/stdc++.h>
#define m(a,b) memset(a,b,sizeof(a))
typedef long long LL;
const int MAX = 1000;
using namespace std;

int tu[MAX+5][MAX+5],m,n;
int sum1[MAX+5][MAX+5],sum2[MAX+5][MAX+5];
int main(){
	
	scanf("%d%d",&n,&m);
	m(sum1,0),m(sum2,0);
	for(int i=1; i<=n; ++i){
		for(int j=1; j<=m; ++j){
			scanf("%d",&tu[i][j]);
			sum1[i][j]=sum1[i][j-1]+tu[i][j];  
            sum2[i][j]=sum2[i-1][j]+tu[i][j];  		
        }
	}
	int ans = 0;
	for(int i=1; i<=n; ++i){
		for(int j=1; j<=m; ++j){
			if(tu[i][j]==0){
				if(sum2[n][j]-sum2[i][j]>0)ans++;  
                if(sum2[i][j]>0)ans++;  
                if(sum1[i][m]-sum1[i][j]>0)ans++;  
                if(sum1[i][j]>0)ans++;
			}	
		}		
	}
	printf("%d\n",ans);
	return 0;	
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值