题目给出一个矩形某几个坐标有数,然后给你一个给定的大小的矩形放置到里面,问如何才能让这个矩形里面的树最多...
这题数据比较弱弱才100,所以首先尝试了下暴力,竟然0ms过了,还是再用树状来一遍吧,在这种数据下树状体现不出优势啊,16ms过啊啊
二维树状数组其实就是更新操作时候多了一层而已,套两层循环直接就ok
就是在最后求解的时候需要用到容斥定理,套用一下小媛大牛的图吧
暴力枚举求解:
#include <stdio.h> #include <string.h> #define N 105 int map[N][N]; int main() { int n,w,h,sum,result,x,y; while(scanf("%d",&n)!=EOF,n) { result=0; memset(map,0,sizeof(map)); scanf("%d%d",&w,&h); for(int i=0;i<n;i++) { scanf("%d%d",&x,&y); map[x][y]=1; } scanf("%d%d",&x,&y); for(int i=1;i<=w-x+1;i++) for(int j=1;j<=h-y+1;j++) { sum=0; for(int p=i;p<i+x;p++) for(int q=j;q<j+y;q++) sum+=map[p][q]; if(sum>result) result=sum; } printf("%d\n",result); } }
二维树状数组
#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> #define MAX 105 int c[MAX][MAX]; int lowbit(int x) { return x&(-x); } void update(int x,int y) { for(int i=x;i<MAX;i+=lowbit(i)) for(int j=y;j<MAX;j+=lowbit(j)) c[i][j]++; } int get(int x,int y) { int sum=0; for(int i=x;i>0;i-=lowbit(i)) for(int j=y;j>0;j-=lowbit(j)) sum+=c[i][j]; return sum; } int main() { int n,w,h,sum,result,x,y; while(scanf("%d",&n)!=EOF,n) { result=0; memset(c,0,sizeof(c)); scanf("%d%d",&w,&h); for(int i=0;i<n;i++) { scanf("%d%d",&x,&y); update(x,y); } scanf("%d%d",&x,&y); for(int i=x;i<=w;i++) for(int j=y;j<=h;j++) { sum=0; sum=get(i,j)-get(i-x,j)-get(i,j-y)+get(i-x,j-y); if(sum>result) result=sum; } printf("%d\n",result); } }