hdu4462 Scaring the Birds || 2012 Asia Hangzhou Regional Contest || 简单暴力

来源:互联网 发布:信用卡加淘宝帐号贷款 编辑:程序博客网 时间:2024/05/16 17:48

hdu4462 Scaring the Birds 请戳

  1. 题意:
    小疯子有一个大小为 n * n 的小孔的地,从(1,1)到(n,n),小疯子种了一些包谷(玉米)。可是不知道哪里来的小 bird 和小 rat 吃了k个小孔上的包谷,最后剩下小孔。小疯子气疯了,要小傻子摆平 bird 和 rat。小傻子决定在这孔上守着,够傻的!!但是这次不是他上阵,而是影分身到多个孔上(小疯子刚从鸣处学来多重影分身之术。。。)守着,为了节省查克拉,小傻子需要你来帮助傻傻的他,如何使用最少的查克来保护所有的包谷,既最少需要多少个分身。由于分身能力有限,只能守住离自己曼哈顿距离为 R 的包谷。
    不能守住所有的包谷,就输出-1, 不然输出分身个数。

  2. 思路:
    暴力枚举影分身个数和对应影分身所在位置,其实就是状压枚举。以为 k 是在是少的可怜,个数枚举 + 需要保护的包谷的单个判断,完全能够解决。
    可惜小傻子在做这个题的时候一直想用贪心来做,无尽wa!(不愧是小傻子!555)

  3. 复杂度:
    时间复杂度:O(n^2 * 2 ^k)
    空间复杂度:O(n^2)

  4. 代码:

/* ***********************************************Author        :IlovezilianCreated Time  :2015/9/2 23:53:09File Name     :1009.cpp************************************************ */#include <bits/stdc++.h>#define INF 0x7fffffffusing namespace std;const int N = 55, mod = 1e9+7;int n;struct nod{    int x, y, r;} po[11];bool vis[N][N];vector<int> v;bool judge(){    for(int i = 1; i <= n; i ++) for(int j = 1; j <= n; j ++)    {        if(vis[i][j]) continue;        bool ok = 0;        int sz = v.size();        for(int k = 0; k < sz; k ++)        {            int x = po[v[k]].x, y = po[v[k]].y, r = po[v[k]].r;            int d = abs(i - x) + abs(j - y);            if(d <= r) {ok = 1; break;}        }        if(!ok)  return 0;    }    return 1;}void solve(){    while(~scanf("%d", &n) && n)    {        memset(vis, 0, sizeof(vis));        int k;        scanf("%d", &k);        for(int i = 0; i < k; i ++)        {            scanf("%d%d", &po[i].x, &po[i].y);            vis[po[i].x][po[i].y] = 1;        }        for(int i = 0; i < k; i ++)            scanf("%d", &po[i].r);        int sta = (1 << k), cnt, ans = 15;        for(int i = 0; i < sta; i ++)        {            cnt = 0;            v.clear();            for(int j = 1, j1 = 0; j <= i; j <<= 1, j1 ++) if(i&j) v.push_back(j1), cnt ++;            if(judge()) ans = min(ans, cnt);        }        if(ans == 15) ans = -1;        printf("%d\n", ans);    }}int main(){    //freopen("","r",stdin);    //freopen("","w",stdout);    solve();    return 0;}
0 0