uvalive3695(降维+扫描)

题意:
给出n个点,让你找一个矩形,是最多的点在矩形边上;
思路:
看了大白的思路:
就是枚举矩形的上下边;
然后每次枚举出上下边界,就从左往右扫描描;
left[i]表示从这条竖线往左一共几个点在上下两边;

on[i]和on2[i]都表示这条竖线上有几个点,on不包括上下边的,而on2包括;


AC:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int  N = 105;
int x[N];
int y[N];
int left[N];
int on[N];
int on2[N];
int n;
struct point{
	int x;
	int y;
}p[N];
int cmp(point a, point b) {
	return a.x < b.x;
}
int solve() {
	sort(p, p + n, cmp);
	sort(y, y + n);
	int	m = unique(y, y + n) - y;
		if(m <= 2) 
			return n;
	int ans = 0;
	for(int i = 0; i < n; i++) {
		for(int j = i + 1; j < n; j++) {
			int uy = y[i];
			int dy = y[j];
			if(uy == dy)
				continue;
			int num = 0;
			for(int k = 0; k < n; k++) {
				if(k == 0 || p[k].x != p[k - 1].x) {
					num++;
					on[num] = on2[num] = 0;
					left[num] = left[num - 1] + on2[num - 1] - on[num - 1];
				}
				if(p[k].y > uy && p[k].y < dy)
					on[num]++;
				if(p[k].y >= uy && p[k].y <= dy)
					on2[num]++;
			}
			if(num <= 2)
				return n;
			int m = 0;
			for(int k = 1; k <= num; k++) {
				ans = max(ans, left[k] + on2[k] + m);
				m = max(m, on[k] - left[k]);
			}
		}
	}
	return ans;
}
int main() {
	int cas = 1;
	while(scanf("%d", &n) && n) {
		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",cas++ ,solve());
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值