题意:给你一个N×M的矩阵,一个格子可以放一个苹果树产量为1,也可以施肥使得上下左右的苹果树产量加倍(可叠加)。问你最多能够得到多少苹果

解题思路:简单的构造问题,我们只需要交替放就行了。

解题代码:

 1 // File Name: 1005.cpp
 2 // Author: darkdream
 3 // Created Time: 2014年08月07日 星期四 12时07分48秒
 4 
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25 
26 using namespace std;
27 int n , m;  
28 int ans[300][300];
29 int p(int x)
30 {
31    int t = 1;
32    for(int i =1;i <= x;i ++)
33       t = t * 2; 
34    return t;
35 }
36 int count(int i , int j)
37 {
38    int sum = ans[i-1][j]+ans[i][j-1] + ans[i+1][j] + ans[i][j+1];
39    return p(sum);
40 }
41 int main(){
42    int t; 
43    scanf("%d",&t);
44    while(t--)
45    {
46       int n , m ; 
47       scanf("%d %d",&n,&m);
48       memset(ans,0,sizeof(ans));
49       for(int i =1;i <= n;i ++)
50       {
51         if(i % 2 == 1)
52         {
53           for(int j =1;j <= m;j ++)
54           {
55               if(j % 2 == 0 )
56               {
57                  ans[i][j] = 1; 
58               }
59           }
60         }else{
61           for(int j  = 1;j <= m;j ++)
62               if(j % 2 == 1 )
63                   ans[i][j] = 1;
64         }
65       }
66       LL rans = 0 ; 
67       for(int i = 1;i <= n;i ++)
68         for(int j = 1;j <= m;j ++)
69         {
70            if(ans[i][j] == 0)
71            {
72               rans += count(i,j);
73            }
74         }
75       printf("%I64d\n",rans);
76    }
77     
78   return 0;
79 }
View Code

 

posted on 2014-08-12 08:52  dark_dream  阅读(181)  评论(0编辑  收藏  举报