您的位置:首页 > 其它

LA 3695 Garbage Heap (DP)

2017-07-24 18:03 357 查看
题意:给出平面上的N个点,找一个矩形使得边界上的点最多

解:选定上下边界,枚举左右边界;

left[i],i边的左边有多少被包含在上下边界上的点,on[i]i边有多少被包含在上下边界上的点(不包括上下边界),on2[i]包括上下边界;

ans=left[j]-left[i]+on2[j]+on[i]; 当枚举右边界时,保留最优值on[i]-left[i],

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<string>
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
char str[1100][1100];
map<int,int>q;
struct node
{
int x, y, cnt;
} p
;
int cmp(node A,node B)
{
return A.x<B.x;
}
int on
, on2
, left1
, ay
, n, k1;
int solve()
{
sort(ay,ay+k1);
sort(p,p+n,cmp);
if(k1<=2) return n;
int ans=0;
for(int i=0; i<k1; i++)
{
for(int j=i+1; j<k1; j++)
{
int ymin=ay[i], ymax=ay[j];
int l=0;
for(int k=0; k<n; k++)
{
if(k==0||p[k].x!=p[k-1].x)
{
++l;
on[l]=on2[l]=0;
left1[l]=left1[l-1]+on2[l-1]-on[l-1];
}
if(p[k].y>ymin&&p[k].y<ymax) on[l]++;
if(p[k].y>=ymin&&p[k].y<=ymax) on2[l]++;
}
if(l<=2) return n;
int m=0;
for(int h=1; h<=l; h++)
{
ans=max(ans,left1[h]+on2[h]+m);
m=max(m,on[h]-left1[h]);
}
}
}
return ans;
}

int main()
{
int t, ncase=1;
while(scanf("%d", &n),n!=0)
{
q.clear();
k1=0;
for(int i=0; i<n; i++)
{
int x, y;
scanf("%d %d", &x, &y);
p[i].x=x,p[i].y=y;
if(!q.count(y)) q[y]=1;
ay[k1++]=y;
}
printf("Case %d: %d\n",ncase++,solve());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: