【P1369】矩形(贪心)
蒟蒻现在连DP都做不出来了,就只能做一些XJB贪心题,这个题题目向非常友好,100的数据范围一看就是让你跑O(n^4)的做法的,然而实际上并不是那么多,大约是,额,反正要快不少。
没什么好说的,直接枚举矩形的左上右下寻找出所有的矩形,然后暴力枚举出最大的那个就可以了,要注意矩形的顶点可能覆盖了某些点,在计算的时候要减去重复的。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #define re register #define maxn 1000007 #define ll long long using namespace std; int n,m; struct point { int x,y,id; }; point a[1001]; int d,ans,map[301][301],sh[1001][1001],sl[1001][1001],maxx,x,y; int main() { cin>>n; for(re int i=1;i<=n;i++) { cin>>x>>y; map[x][y]=1; } for(re int i=1;i<=100;i++) { for(re int j=1;j<=100;j++) { if(map[i][j]) { sh[i][j]=sh[i][j-1]+1; sl[i][j]=sl[i-1][j]+1; }else { sh[i][j]=sh[i][j-1]; sl[i][j]=sl[i-1][j]; } } } for(re int k=1;k<=100-1;k++) { for(re int i=1;i<=100-1;i++) { for(re int j=i+1;j<=100;j++) { for(re int x=k+1;x<=100;x++) { ans=(sh[x][j]-sh[x][i])+(sh[k][j]-sh[k][i])+(sl[x][j]-sl[k][j])+(sl[x][i]-sl[k][i]); if(map[k][i]) ans--; if(map[x][i]) ans--; if(map[k][j]) ans--; if(map[x][j]) ans--; maxx=max(ans,maxx); } } } } cout<<maxx; }
对于作者转载文章,欢迎继续转载。
对于作者原创文章,请注明出处之后转载。