标签:
2 2 2 3 3
8 32 题意:一个各自要么能种一个苹果数,要么能够施肥,施肥的话,会使得它的上下左右苹果树都加倍,求最多的可能 思路:依次施肥种树计算#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 110; int map[maxn][maxn]; int n, m; int cal(int i, int j) { int ans = 1; if (map[i][j+1] == 0) ans <<= 1; if (map[i+1][j] == 0) ans <<= 1; if (map[i-1][j] == 0) ans <<= 1; if (map[i][j-1] == 0) ans <<= 1; return ans; } int main() { int t; scanf("%d", &t); while (t--) { scanf("%d%d", &n, &m); memset(map, -1, sizeof(map)); int flag = 0; for (int i = 1; i <= m; i++) { map[1][i] = flag; flag = !flag; } for (int i = 2; i <= n; i++) for (int j = 1; j <= m; j++) map[i][j] = !map[i-1][j]; int ans = 0; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) if (map[i][j]) ans += cal(i, j); memset(map, -1, sizeof(map)); flag = 1; for (int i = 1; i <= m; i++) { map[1][i] = flag; flag = !flag; } for (int i = 2; i <= n; i++) for (int j = 1; j <= m; j++) map[i][j] = !map[i-1][j]; int tmp = 0; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) if (map[i][j]) tmp += cal(i, j); printf("%d\n", max(ans, tmp)); } return 0; }
版权声明:本文博主原创文章,博客,未经同意不得转载。
标签:
原文地址:http://www.cnblogs.com/lcchuguo/p/4906897.html