• 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();
    	}
    
    }
    
  • 相关阅读:
    【随手记】常用16进制代表的容量或位置
    精通css——position属性
    Ubuntu安装GitLab
    Linux内核
    分布式(一)——分布式系统的特性
    【树莓派】入门
    Intel CPU发展历史
    C++读mnist数据
    实验代码一:用来链表实现单向图
    Hadoop配置+centos6.5
  • 原文地址:https://www.cnblogs.com/waryan/p/14296629.html
Copyright © 2020-2023  润新知