这道题是今天多校联合里相对简单的一道题
题意就是 果园是一个n*m规模的~每个grid如果种苹果,那么可以得到一个苹果,如果不种苹果但是给它施肥,会使这个grid的四个方向的苹果树结的苹果数量翻倍;
那么问这个果园可以收获的最大苹果数量;
思路:
找规律,先找 1*1大小的果园 那么结果是1个,
.......再找1*2,1*3,1*4......1*m,最后会发现 结果是 1 2 4 6 8 10 ...... 这是第一行,那么第一列也是这个规律。。。
再接着找规律,可以发现最优解: 相当于隔一个空载个苹果树,然后暴力枚举即可;
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <string.h>
using namespace std;
int map[200][200];
int n,m,t;
long long dfs(int x,int y)
{
long long cnt=1;
if(x-1>=1)
{
if(map[x-1][y])
cnt=cnt*2;
}
if(x+1<=n)
{
if(map[x+1][y])
cnt=cnt*2;
}
if(y-1>=1)
{
if(map[x][y-1])
cnt=cnt*2;
}
if(y+1<=m)
{
if(map[x][y+1])
cnt=cnt*2;
}
return cnt;
}
int main()
{
cin>>t;
while(t--)
{
scanf("%d%d",&n,&m);
memset(map,0,sizeof(map));
if(n==1&&m==1)
{
printf("1\n");
continue;
}
if(n==1)
{
printf("%d\n",2*(m-1));
continue;
}
if(m==1)
{
printf("%d\n",2*(n-1));
continue;
}
for(int i=1;i<=n;i++)
{
if(i&1)
{
int j=1;
while(j<=m)
{
map[i][j]=1;
j+=2;
}
}
else
{
int j=2;
while(j<=m)
{
map[i][j]=1;
j+=2;
}
}
}
long long ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(!map[i][j])
{
ans+=dfs(i,j);
}
}
printf("%I64d\n",ans);
}
return 0;
}