2012 Asia Hangzhou Regional Contest--hdu4462Scaring the Birds(IDA)
2013-10-09 22:07
351 查看
题目请戳这里
题目大意:
有一个n*n的格子,有k个空地,其他地方都种的有庄稼。现在要在k个空地中放稻草人保护庄稼,每个稻草人罩附近距离他曼哈顿距离不超过r的点,求最少需要多少个稻草人能罩住所有的庄稼。
题目分析:k太小了,n太小了,IDA爆搜之。
不过跑的好慢啊,hdu rank倒数第一。。。
详情请见代码:
题目大意:
有一个n*n的格子,有k个空地,其他地方都种的有庄稼。现在要在k个空地中放稻草人保护庄稼,每个稻草人罩附近距离他曼哈顿距离不超过r的点,求最少需要多少个稻草人能罩住所有的庄稼。
题目分析:k太小了,n太小了,IDA爆搜之。
不过跑的好慢啊,hdu rank倒数第一。。。
详情请见代码:
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include<cctype> #include<map> #include<vector> #include<set> #include<queue> #include<string> #include<ctime> using namespace std; const int N = 51; const int M = 10000005; const int inf = 0x3f3f3f3f; const double eps = 1e-6; const double PI = acos(-1.0); typedef __int64 ll; int flag ; bool used ; struct node { int x,y,r; }pt ; int n,k; int ans,corns; bool ok; int put(int id) { int i,j; int row,col; int ret = 0; row = pt[id].x - pt[id].r; if(row < 1) row = 1; for(i = row,col = pt[id].r - (pt[id].x - row);i <= pt[id].x;i ++,col ++) { int l,r; l = max(1,pt[id].y - col); r = min(n,pt[id].y + col); for(j = l;j <= r;j ++) { flag[i][j] ++; if(flag[i][j] == 1) ret ++; } } row = pt[id].x + pt[id].r; if(row > n) row = n; for(i = pt[id].x + 1,col = pt[id].r - 1;i <= row;i ++,col --) { int l,r; l = max(1,pt[id].y - col); r = min(n,pt[id].y + col); for(j = l;j <= r;j ++) { flag[i][j] ++; if(flag[i][j] == 1) ret ++; } } return ret; } void disput(int id) { int i,j; int row,col; row = pt[id].x - pt[id].r; if(row < 1) row = 1; for(i = row,col = pt[id].r - (pt[id].x - row);i <= pt[id].x;i ++,col ++) { int l,r; l = max(1,pt[id].y - col); r = min(n,pt[id].y + col); for(j = l;j <= r;j ++) { flag[i][j] --; } } row = pt[id].x + pt[id].r; if(row > n) row = n; for(i = pt[id].x + 1,col = pt[id].r - 1;i <= row;i ++,col --) { int l,r; l = max(1,pt[id].y - col); r = min(n,pt[id].y + col); for(j = l;j <= r;j ++) { flag[i][j] --; } } } void show() { for(int i = 1;i <= n;i ++) { for(int j = 1;j <= n;j ++) printf("%4d",flag[i][j]); putchar(10); } } void dfs(int dp,int last) { if(last == 0) { ok = true; return; } //show(); if(dp >= ans) return; if(ok) return; int i; for(i = 1;i <= k;i ++) { if(used[i]) continue; used[i] = true; int tmp = put(i); dfs(dp + 1,last - tmp); disput(i); used[i] = false; } } int main() { int i; while(scanf("%d",&n),n) { scanf("%d",&k); memset(flag,0,sizeof(flag)); for(i = 1;i <= k;i ++) { scanf("%d%d",&pt[i].x,&pt[i].y); flag[pt[i].x][pt[i].y] = inf; } for(i = 1;i <= k;i ++) scanf("%d",&pt[i].r); corns = n * n - k; if(corns <= 0) { printf("0\n"); continue; } ans = 0; ok = false; memset(used,false,sizeof(used)); while(1) { ans ++; dfs(0,corns); if(ok || ans >= k) break; } if(ok) printf("%d\n",ans); else printf("-1\n"); } return 0; }
相关文章推荐
- 训练赛:2012 Asia Hangzhou Regional Contest
- 2012 Asia Hangzhou Regional Contest--hdu4460Friend Chains(SPFA)
- 2012 Asia Hangzhou Regional Contest--hdu4463Outlets(mst)
- 2012 Asia Hangzhou/Jinhua Regional Contest
- hdu 4462 Scaring the Birds || 2012 Asia Hangzhou Regional Contest || bfs
- 2012 Asia Hangzhou Regional Contest
- hdu4462 Scaring the Birds || 2012 Asia Hangzhou Regional Contest || 简单暴力
- hdu4770 暴力状压 Lights Against Dudely (2013 Asia Hangzhou Regional Contest problem A)
- 2012 ACM/ICPC Asia Regional Hangzhou Online ,HDU4417-Super Mario
- hdu 3641 2010 Asia Regional Hangzhou Site —— Online Contest 数论题,分解质因子
- 2012 Asia Chengdu Regional Contest hdu 4474(数位bfs)
- HDU 4770 Lights Against Dudely(2013 Asia Hangzhou Regional Contest A)
- HDU4417-树状数组2012 ACM/ICPC Asia Regional Hangzhou Online
- zoj 3659 Conquer a New Region The 2012 ACM-ICPC Asia Changchun Regional Contest
- hdu 4778 Gems Fight! 2013 Asia Hangzhou Regional Contest
- HDU 4441 Queue Sequence(优先队列+Treap树)(2012 Asia Tianjin Regional Contest)
- 2013 Asia acm Hangzhou Regional Contest 杭州现场赛
- hdu4465 2012 Asia Chengdu Regional Contest 概率期望计算+对数放大/缩小幂指数+对数还原
- HDU 3685 Rotational Painting(多边形质心+凸包)(2010 Asia Hangzhou Regional Contest)
- hdu4430 Yukari's Birthday 2012 ACM_ICPC Asia ChangChun Regional Contest problem K