种南瓜
时间限制: 2 Sec 内存限制: 128 MB题目描述
一班的同学们决定在班上种南瓜时,pac 感到十分震惊,因为种南瓜是分耗费班级空间的。一班拥有一块 n×m 的地,可以在其中任意一个单元格上种南瓜秧,而南瓜会长在种上的相邻格子,一个格子最多长一个南瓜 。
当然,并不像 MC 中的南瓜长成方式,一班的南瓜经过基因变异,一只南瓜秧可以长出多个南瓜,也就是说,如果四周都没有被占用,仅种下一枝就可收获 4 个南瓜。
pac 已经得知同学们种南瓜的具体方案,她想知道最多可以收获多少个南瓜。
班长 Marser 还想知道,如果南瓜没有经过变异,也就是说一枝南瓜秧只能长出最多一个南瓜,合理种植,这块地上最多能出南瓜的数量 。
当然,并不像 MC 中的南瓜长成方式,一班的南瓜经过基因变异,一只南瓜秧可以长出多个南瓜,也就是说,如果四周都没有被占用,仅种下一枝就可收获 4 个南瓜。
pac 已经得知同学们种南瓜的具体方案,她想知道最多可以收获多少个南瓜。
班长 Marser 还想知道,如果南瓜没有经过变异,也就是说一枝南瓜秧只能长出最多一个南瓜,合理种植,这块地上最多能出南瓜的数量 。
输入
第一行两个正整数 n、m(2≤m,n≤5000),为地的大小 。
第 2−n+1 行 ,每行 m 个数字,第 i 行第 j 个数字为 0 或 1,如果等于 1,表示 ai,j这块地上将种下南瓜秧;如果为 0,表示不种。
第 2−n+1 行 ,每行 m 个数字,第 i 行第 j 个数字为 0 或 1,如果等于 1,表示 ai,j这块地上将种下南瓜秧;如果为 0,表示不种。
输出
输出一行两个整数 P、M,分别回答 pac 和 Marser 的问题 。
11 24
题解
这是个奇葩题目。算过来算过去不知道样例24是怎么来的,实在是没想到瓜居然还能长到外面去......知道瓜能长到外面这一点后,直接暴力就行了。
1 #include<cstdio> 2 #include<iostream> 3 #define RG register 4 #define IL inline 5 using namespace std; 6 const int N = 5009; 7 int n, m, ans; 8 int g[N][N]; 9 int gx[] = {0, 0, 1, -1}; 10 int gy[] = {1, -1, 0, 0}; 11 IL int read() 12 { 13 int num = 0; char c; bool flag = 0; 14 while((c=getchar()) == ' ' || c == '\n' || c == '\r'); 15 if(c == '-') flag = 1; else num = c - '0'; 16 while(isdigit(c=getchar())) 17 num = num * 10 + c - '0'; 18 return flag ? - num : num; 19 } 20 int main() 21 { 22 n = read(); m = read(); 23 for(RG int i = 1; i <= n; i++) 24 for(RG int j = 1; j <= m; j++) 25 g[i][j] = read(); 26 for(RG int i = 1; i <= n; i++) 27 for(RG int j = 1; j <= m; j++) 28 if(g[i][j] == 1) 29 { 30 for(RG int k = 0; k < 4; k++) 31 if(g[i+gx[k]][j+gy[k]] == 0) 32 g[i+gx[k]][j+gy[k]] = -1; 33 } 34 for(RG int i = 0; i <= n+1; i++) 35 for(RG int j = 0; j <= m+1; j++) 36 if(g[i][j] == -1) 37 ans++; 38 printf("%d %d\n", ans, 2*(n+m)-4+(n-2)*(m-2)/2); 39 return 0; 40 }