zoukankan      html  css  js  c++  java
  • 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("
    ");
    
    
    }
    signed main() {
    	int T = 1;
    	scanf("%d", &T);
    	//  cin >> T;
    	while (T--) {
    		solve();
    	}
    
    }
    
  • 相关阅读:
    如何修改Linux命令提示符
    HTTP 状态码及对应字符串详解
    Java 获取键盘输入
    Java中的IO整理完整版(一)
    清除代码异味
    报告称当前Linux人才抢手 高薪也难觅
    QT修改程序图标
    java中的io系统详解
    如果AntlrWorks的Debug报错“当前端口已被占用”,可能是防火墙的原因
    报表引擎 - 研究润乾报表的实现
  • 原文地址:https://www.cnblogs.com/waryan/p/14296629.html
Copyright © 2011-2022 走看看