当前位置: 首页 > ai >正文

CodeForces 1453C. Triangles

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

题目大意

给你一个矩阵,每个格子是0-9之间的任何一个元素,现在对于0-9这10个不同的数,要在矩阵内构造出最大的三角形
每个三角形的定义如下,设当前要构造的是第 d d d个数的最大三角形:
该三角形的三个顶点都要是数d
必须有一条边平行于矩阵
在每次构造三角形的时候可以把矩阵内任意一个点的大小改为d,构造完后改回(每次构造之间修改不影响)
为了简便计算,求三角形面积时不需要/2,直接 底*高 即可

思路1

其实只需要确定两个点的位置,剩下一个点因为可以任意取一个点,所以关键是怎么选择其中两个点,对于第d个数,如果点的数量<=1,那么修改一个也不够凑成三角形,直接输出0

否则记录每个点的x,y坐标,
首先考虑垂直边平行于坐标轴的情况(两个点x值相等),遍历所有点,
对于相同元素d的点按行坐标进行递增排序
则以垂直边为底的高的最大值就是:

最后一个点减去当前点的横坐标 最后一个点减去当前点的横坐标 最后一个点减去当前点的横坐标 当前点的横坐标减去第一个点的横坐标 当前点的横坐标减去第一个点的横坐标 当前点的横坐标减去第一个点的横坐标
的最大值(不太严谨的可以将当前点看做中点,取左边或者右边),

那么这条平行边的最大值就是 当前点离x轴的距离y或者n-y+1(第三个点的y值)
这样我们就求出了当选择这个点且垂直边平行于坐标轴时的情况,取所有点得出的最大值

然后交换所有点的行和列坐标翻转再来一遍,相当于是求水平边平行于坐标轴的情况

// Author: zengyz
// 2025-06-12 15:55#include <bits/stdc++.h>
#include <iostream>
using namespace std;
using i64 = long long;void solve()
{int n;cin >> n;vector<vector<int>> a(n, vector<int>(n, 0));vector<pair<int, int>> vp[10];for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){char op;cin >> op;a[i][j] =op-'0';vp[a[i][j]].push_back({i, j});}}for (int i = 0; i <= 9; i++){if (vp[i].size() <= 1){cout << "0 " ;}else{int ans=0;for(int k=0;k<2;k++){sort(vp[i].begin(), vp[i].end());for(auto x:vp[i]){int disx=max(vp[i].back().first-x.first,x.first-vp[i][0].first);int disy=max(x.second,n-1-x.second);ans=max(ans,disx*disy);}for(auto &x:vp[i])swap(x.first,x.second);}cout<<ans<<" ";}}cout<<endl;return;
}int main()
{ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int _T = 1;cin >> _T;while (_T--){solve();}return 0;
}

思路2

先考虑水平边平行于x轴的情况
考虑一个点(x,y),设第三个点会与这个点平行,因为可以任取,所以既可以在最左边长度为(1,y),也可以在最右边(n,y)
那么取max(x,n-x+1)那么剩下一个点就取离这条平行边最远的一个点,设构造第d个三角形时垂直方向出现过的最大值ya和最小值yi,则有高为max(ya-j,j-yi)
那么答案就是 m a x ( x , n − x + 1 ) ∗ m a x ( y a − j , j − y i ) max(x,n-x+1)*max(ya-j,j-yi) max(x,nx+1)max(yaj,jyi)

竖直方向同理

// Author: zengyz
// 2025-06-12 15:55#include <bits/stdc++.h>
#include <iostream>
using namespace std;
using i64 = long long;void solve()
{int n;cin >> n;vector<vector<int>> a(n, vector<int>(n, 0));vector<int> xi(10, 1e9), xa(10), yi(10, 1e9), ya(10), ans(10);for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){char op;cin >> op;int now = op - '0';a[i][j] = now;xi[now] = min(xi[now], i);xa[now] = max(xa[now], i);yi[now] = min(yi[now], j);ya[now] = max(ya[now], j);}}for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){int now = a[i][j];ans[now] = max(ans[now], max(i, n - 1 - i) * max(ya[now] - j, j - yi[now]));ans[now] = max(ans[now], max(j, n - 1 - j) * max(xa[now] - i, i - xi[now]));}}for (int i = 0; i <= 9; i++)cout << ans[i] << " ";cout << endl;return;
}int main()
{ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int _T = 1;cin >> _T;while (_T--){solve();}return 0;
}
http://www.xdnf.cn/news/13776.html

相关文章:

  • QOpenGLWidget 中能同时显示 .step 的结构树和渲染图吗
  • 快递鸟电商退换货技术全解析:构建智能化逆向物流管理体系
  • IT运维的365天--028 批处理自行检测并以管理员权限运行
  • vue3 常见引用
  • 伊吖学C笔记(6、数、求和、排列)
  • 模拟电路的知识
  • 如何通过插件系统打造个性化效率工作流
  • go部分语法记录
  • 【Fifty Project - D36】
  • 2025pmx文件怎么打开blender和虚幻
  • 林业资源多元监测技术守护绿水青山
  • 说一下Java里面线程池的拒绝策略
  • 从实验室到实践:无人机固件越权提取技术解析
  • DNS常用的域名记录
  • 品融电商:头部全域电商代运营,助品牌决胜多平台时代
  • supervisorctr命令简介
  • 翻译核心词汇
  • React中修改 state 时必须返回一个新对象 (immutable update)
  • Windows环境变量原理(用户变量与系统变量)(用户环境变量、系统环境变量)
  • 解锁 AI 短视频创作密码,开启你的创意之旅
  • DOcplex用法锦集(持续更新)
  • CKA考试知识点分享(12)---configmap
  • 【Android Studio】新建项目及问题解决
  • python3如何使用QT编写基础的对话框程序
  • 【开发常用命令】:服务器与本地之间的数据传输
  • wsl 安装vllm 0.9.1 + torch 2.7.0 + xformers 0.0.30 + flashinfer
  • RocketMQ 客户端编程模型
  • 第28节 Node.js 文件系统
  • SAP调用deepseek 的API
  • 成像细节丢失如何解决?OAS 矩孔衍射聚焦模型来解困