牛栏POJ3179

牛栏POJ3179(待补)

思路

题干在这:POJ3179
统计各地点草的个数同时算一个最大的边长,然后求出二维前缀和,二分正方形边长,枚举算出答案。
但这个题我非常chun地直接做,结果超出内存限制……我们能发现输入的点的个数很少,我们应该离散化处理,缩小二维数组的内存。
但我现在懒得改了,待补

ml代码

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#define MAX 10010
using namespace std;
int grass[MAX][MAX] = { 0 };
int main() {
	int c, n;
	cin >> c >> n;
	int lmax = 0;
	for (int i = 1; i <= n; i++) {
		int x, y;
		cin >> x >> y;
		grass[x][y]++;
		lmax = max(lmax, max(x, y));
	}
	for (int i = 1; i <= lmax; i++)
		for (int j = 2; j <= lmax; j++)
			grass[i][j] += grass[i][j - 1];
	for (int j = 1; j <= lmax; j++)
		for (int i = 2; i <= lmax; i++)
			grass[i][j] += grass[i - 1][j];
	int l = 1, r = lmax;
	while (l != r) {
		int mid = (l + r) / 2;
		int maxgrass = 0;
		for (int i = 1; i <= lmax; i++) {
			for (int j = 1; j <= lmax; j++) {
				int xmax = min(lmax, i + mid - 1), ymax = min(lmax, j + mid - 1);
				int num = grass[xmax][ymax] + grass[i - 1][j - 1] - grass[xmax][j - 1] - grass[i - 1][ymax];
				maxgrass = max(maxgrass, num);
			}
		}
		if (maxgrass >= c) 
			r = mid;
		else
			l = mid + 1;
	}
	cout << l;
}
发布了24 篇原创文章 · 获赞 0 · 访问量 355

猜你喜欢

转载自blog.csdn.net/qq_45616764/article/details/104198953
POJ