hdu 4925规律题

来源:互联网 发布:程序员的qq头像 编辑:程序博客网 时间:2024/03/28 22:43

这道题是今天多校联合里相对简单的一道题

CLICK HE

题意就是  果园是一个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;}


0 0