紫书 习题8-19 UVa 1312 (枚举技巧)

这道题参考了https://www.cnblogs.com/20143605--pcx/p/4889518.html

这道题就是枚举矩形的宽, 然后从宽再来枚举高。

具体是这样的, 先把所有点的高度已经0和最高点储存起来, 排个序。

然后就可以枚举所有可能的矩形的宽, 然后可以理解为从左到右扫一遍, 如果没有

点来阻碍的话, 继续扫, 如果有的话,  那么矩形的长就是这次扫到阻碍时的横坐标与

上次扫到阻碍时的横坐标的差值, 这一部分是刚好两端都有阻碍。

所以就可以枚举所有可能的矩形, 然后算答案的时候按照正方形来算就ok了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;

const int MAXN = 112;
struct node
{
	int x, y;
}a[MAXN];
int d[MAXN];

bool cmp(node a, node b)
{
	if(a.x != b.x)
		return a.x < b.x;
	return a.y < b.y;
}

int main()
{
	int T, n, w, h;
	scanf("%d", &T);
	
	while(T--)
	{
		scanf("%d%d%d", &n, &w, &h);
		d[0] = 0; d[n+1] = h;
		REP(i, 1, n + 1)
		{
			scanf("%d%d", &a[i].x, &a[i].y);
			d[i] = a[i].y;
		}
		
		sort(a + 1, a + n + 1, cmp);
		sort(d, d + n + 2);
		int ans = 0, ansx, ansy;
		REP(i, 0, n + 1)
			REP(j, i + 1, n + 2)
			{
				int high = d[j], low = d[i], r = high - low, pre = 0, c;
				REP(k, 1, n + 1)
				{
					if(a[k].y <= low || a[k].y >= high) continue;
					c = a[k].x - pre;
					if(ans < min(r, c))
					{
						ans = min(r, c);
						ansx = pre;
						ansy = low;
					}
					pre = a[k].x;
				}
				c = w - pre;
				if(ans < min(r, c))
				{
					ans = min(r, c);
					ansx = pre;
					ansy = low;
				}
			}
		
		printf("%d %d %d\n", ansx, ansy, ans);
		if(T) puts("");
	}
	
	return 0;	
} 

posted @ 2018-05-12 16:35  Sugewud  阅读(158)  评论(0编辑  收藏  举报