HDU 4925 Apple Tree
For each test case, two integers N, M (1<=N, M<=100) are given in a line, which denote the size of the map.
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; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。