首页 > 代码库 > hdu 4925 贪心 自己从小到大做数据找方法规律

hdu 4925 贪心 自己从小到大做数据找方法规律

http://acm.hdu.edu.cn/showproblem.php?pid=4925

自己逐个做数据找规律,提供下我的找的:
1 2

1 3

2 2

2 3

3 3

然后发现这样的矩阵是最优的:


然后初始化的时候搞一个100*100的矩阵,然后每次对这个矩阵统计下2^1 2^2 2^3 2^4各有几个即可

WA了一次,因为我的统计方法里,n==1 m==1这种会出现错误

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;

#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const ll ll_INF = ((ull)(-1))>>1;
const double EPS = 1e-8;
const int INF = 100000000;
ll n,m;
const int MAXN = 110;
bool mat[MAXN][MAXN];

ll p[5]={1,2,4,8,16};
ll cnt[5];

void init()
{
    for(int i=1;i<=100;i++)
        for(int j=1;j<=100;j++)
        {
            if(i%2)mat[i][j]=j%2;
            else mat[i][j]=!(j%2);
        }
}

ll solve()
{
    CL(cnt,0);
    //ll a1=0,a2,a3,a4=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(mat[i][j])
            {
                ll ret=0;
                if(i-1>=1)ret++;
                if(i+1<=n)ret++;
                if(j-1>=1)ret++;
                if(j+1<=m)ret++;
                cnt[ret]++;
            }

        }
    return p[1]*cnt[1]+p[2]*cnt[2]+p[3]*cnt[3]+p[4]*cnt[4];
}

int main()
{
    //IN("hdu4925.txt");
    int ncase;
    init();
    scanf("%d",&ncase);
    while(ncase--)
    {
        scanf("%I64d%I64d",&n,&m);
        if(n==1 && m==1)printf("1\n");
        else printf("%I64d\n",solve());
    }
    return 0;
}


hdu 4925 贪心 自己从小到大做数据找方法规律