题目链接:https://vjudge.net/problem/UVALive-3695
题意:给出n个点,找出一个矩形,使得所有的点恰好在矩形的边上的个数最多,求最多是多少。
白书53页
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
pair<int,int>A[110];
int y[110],on[110],on2[110],left[110];
int n,m;
int solve()
{
sort(A+1,A+n+1);
sort(y+1,y+n+1);
m=unique(y+1,y+n+1)-y-1;
int ans=0;
if(m<=2) return n;
for(int a=1;a<m;a++)
{
for(int b=a+1;b<=m;b++)
{
int k=0;
for(int i=1;i<=n;i++)
{
if(i==1||A[i].first!=A[i-1].first)
{
k++;
on[k]=on2[k]=0;
left[k]=left[k-1]+on2[k-1]-on[k-1];
}
if(A[i].second<y[b]&&A[i].second>y[a]) on[k]++;
if(A[i].second<=y[b]&&A[i].second>=y[a]) on2[k]++;
}
if(k<=2) return n;
int M=0;
for(int i=1;i<=k;i++)
{
ans=max(ans,left[i]+on2[i]+M);
M=max(M,on[i]-left[i]);
}
}
}
return ans;
}
int main()
{
int t=0;
while(~scanf("%d",&n),n)
{
for(int i=1;i<=n;i++)
{
scanf("%d%d",&A[i].first,&A[i].second);
y[i]=A[i].second;
}
printf("Case %d: %d\n",++t,solve());
}
}