可交题的传送门
代码:
#include <bits/stdc++.h> using namespace std; struct node { int x,y; bool operator <(const node &t)const { return x<t.x; } }p[110]; int n,m,y[110],on[110],on2[110]; int Left[110]; int solve() { sort(p,p+n); sort(y,y+n); m=unique(y,y+n)-y; if(m<=2) return n; int ans=0; for(int a=0;a<m;a++) { for(int b=a+1;b<m;b++) { int ymin=y[a],ymax=y[b]; int k=0; for(int i=0;i<n;i++) { if(i==0||p[i].x!=p[i-1].x) { k++; on[k]=on2[k]=0; Left[k]=k==0?0:Left[k-1]+on2[k-1]-on[k-1]; } if(p[i].y>ymin&&p[i].y<ymax) on[k]++; if(p[i].y>=ymin&&p[i].y<=ymax) on2[k]++; } if(k<=2) return n; int M=0; for(int j=1;j<=k;j++) { ans=max(ans,Left[j]+on2[j]+M); M=max(M,on[j]-Left[j]); } } } return ans; } int main() { int kase=0; while(~scanf("%d",&n)) { if(n==0) break; for(int i=0;i<n;i++) { scanf("%d%d",&p[i].x,&p[i].y); y[i]=p[i].y; } printf("Case %d: %d\n",++kase,solve()); } return 0; }