Codeforces Round #688 (Div. 2)C. Triangles(思维+贪心)

题意

给你一个n*n的由0~9组成的矩阵,问你相同数组组成的三角形,其中一条边必须平行于x轴或y轴,而且可以自己随机加一个点,然后问你0~9数组分别组成的三角形的面积乘以2的最大值。

思路

首先找出每个数字的x轴方向最大最小,y轴方向最大最小,然后去遍历每个相应的点和这些最大最小组合后的最大面积。

自己选的一个点一定是选在边界的

#include<bits/stdc++.h>
using namespace std;
const int N = 2e3 + 100;
typedef long long LL;
//#define int long long

int a[N][N];
int xmax[10], ymax[10], xmin[10], ymin[10], ans[10];
void solve() {
	int n ; 
	scanf("%d", &n);
	for (int i = 0; i < 10; ++i) {
		xmax[i] = ymax[i] = ans[i] = 0;
		xmin[i] = ymin[i] = 1e9 + 10;
	}
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= n; ++j) {
			int x; scanf("%1d", &a[i][j]);
			x = a[i][j];
			xmax[x] = max(xmax[x], j);
			xmin[x] = min(xmin[x], j);
			ymax[x] = max(ymax[x], i);
			ymin[x] = min(ymin[x], i);
		}
	}
	for (int i = 1; i <= n; ++i) {
		for(int j = 1; j <= n; ++j) {
			int x = a[i][j];
			if (xmax[x] != 0) ans[x] = max(ans[x], abs(xmax[x] - j) * max(i - 1, n - i));
			if (xmin[x] != 1e9 + 10) ans[x] = max(ans[x], abs(j -xmin[x]) * max(i - 1, n - i));
			if (ymax[x] != 0) ans[x] = max(ans[x], abs(ymax[x] - i) * max(j - 1, n - j));
			if (ymin[x] != 1e9 +10) ans[x] = max(ans[x], abs(ymin[x] - i) * max(j - 1, n - j));
		}
	}
	for (int i = 0; i <= 9; ++i) {
		if (i) printf(" ");
		printf("%d", ans[i]);
	}
	printf("\n");


}
signed main() {
	int T = 1;
	scanf("%d", &T);
	//  cin >> T;
	while (T--) {
		solve();
	}

}
posted @ 2021-01-19 10:35  waryan  阅读(65)  评论(0编辑  收藏  举报