CodeForces 1453 C. Triangles
题目大意:
给一个矩阵,每个元素都是 1 − 9 1-91−9,对每个 d dd,选三点都是 d dd 的,问组成最大的三角形面积多大,每个 d dd ,都可以把一个数字改成 d dd,然后算完在改回去。d dd 是 1 − 9 1 - 91−9 遍历的
思路:
记录每个数字的最大行最小行,最大列和最小列。然后枚举每个位置,用刚记录的算,具体看代码理解
代码:
#include <bits/stdc++.h>
using namespace std;
#define me(a, b) memset(a, b, sizeof(a))
#define IOS() ios::sync_with_stdio(false), cin.tie(0)
#define endl '\n'
typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int maxn = 2e3 + 5;
const ll mod = 1e9 + 7;
char s[maxn][maxn];
void solve()
{
int ans[10] = {0};
int maxr[10] = {0}, minr[10];
int maxc[10] = {0}, minc[10];
for(int i = 0; i < 10; ++i)
minr[i] = minc[i] = INF;
int n;
cin >> n;
for(int i = 1; i <= n; ++i) {
cin >> s[i]+1;
for(int j = 1; j <= n; ++j) {
int x = s[i][j] - '0';
maxr[x] = max(maxr[x], i), minr[x] = min(minr[x], i);
maxc[x] = max(maxc[x], j), minc[x] = min(minc[x], j);
}
}
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j) {
int x = s[i][j] - '0';
ans[x] = max(ans[x], max(i-minr[x], maxr[x]-i) * max(n-j, j-1));
ans[x] = max(ans[x], max(j-minc[x], maxc[x]-j) * max(n-i, i-1));
}
}
for(int i = 0; i < 10; ++i)
cout << ans[i] << " ";
cout << endl;
}
int main()
{
IOS();
int T;
cin >> T;
while(T--)
solve();
return 0;
}
总结:
没想出来,头皮都抠破了,烦躁,还是看官方题解补的,太菜了
版权声明:本文为weixin_43313475原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。