题意:
给出数点,求一个矩阵,使得落在矩阵边界的点最多.
发现博客这种东西,要么立刻马上写,要么立刻马上忘.#老年痴呆患者的怒吼#
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100+10;
struct poin {
int x, y;
bool operator <(const poin& p)const {
return x < p.x;
}
}p[maxn];
int n, lef[maxn], on[maxn], on2[maxn], y[maxn];
int deal() {
int m = unique(y, y+n)-y;
if(m<=2) return n;//最多只有两层
int ans = 0;
for(int i=0; i<m; i++)
for(int j=i+1; j<m; j++) {
int ymin=y[i], ymax=y[j];
int q=0;
for(int k=0; k<n; k++) {
if(k==0 || p[k].x != p[k-1].x) {
q++;
on[q] = on2[q] = 0;
lef[q] = q==0?0:lef[q-1]+on2[q-1]-on[q-1];
}
if(p[k].y > ymin && p[k].y < ymax) on[q]++;
if(p[k].y >= ymin && p[k].y <= ymax) on2[q]++;
}
if(q <= 2) return n;//最多只有两排
int M=0;
for(int j=1; j<=q; j++) {
ans = max(ans, lef[j]+M+on2[j]);
M = max(M, on[j]-lef[j]);
}
}
return ans;
}
int main() {
int kase = 0;
while(scanf("%d", &n)!=EOF && n) {
for(int i=0; i<n; i++) {
scanf("%d%d", &p[i].x, &p[i].y);
y[i] = p[i].y;
}
sort(p, p+n);
sort(y, y+n);
int ans = deal();
printf("Case %d: %d\n",++kase, ans);
}
return 0;
}
思路:
主要思路就是i->j范围内的点数等与lef[j]-lef[i]+on2[j]+on[i],推出让on[i]-lef[i]尽量大,用一层循环,先求出当前终点的最大点数,然后调整M值(M系左值)
学到一个新的函数unique(y, y+n)-y, 可求一个数组有几个不同值,然后按蹭枚举,再枚举所有点,累加层次范围内同一垂直线的点数,形成on, on2, lef.