这题纯暴力,上吧!
暴力
yyds!
这题呢,就是枚举每一个点,看看是否可以构成一个满足条件的三角形。
如果可以构成一个满足条件的三角形的话,那么就计算它的面积乘二,因为题目中说:
由于面积不一定为整数,输出栅栏柱子可以围成的合法三角形的最大面积的两倍。
所以我们用底乘高即可。
判断是否是一个满足条件的三角形,只要满足点i和点j的x坐标相等,点j和点k的y坐标相等。
#include <bits/stdc++.h>
using namespace std;
int n, ans = 0;
pair<int, int> a[110];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d%d", &a[i].first, &a[i].second);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++) {
if (i == j || i == k || j == k) continue; //重复就continue
if (a[i].first == a[j].first && a[j].second == a[k].second) {
ans = max(ans, abs(a[i].second - a[j].second) * abs(a[i].first - a[k].first));
//底乘高取最大值
//由于要输出两倍,所以我们这里计算面积不除以二
}
}
printf("%d\n", ans);
return 0;
}
大佬我有个疑问,我把pair函数换成两个数组为什么过不了
代码发一下吧
#include[HTML_REMOVED]
#include[HTML_REMOVED]
#include[HTML_REMOVED]
#include[HTML_REMOVED]
using namespace std;
const int N=10010;
int n,s;
int x[N],y[N];
int main()
{
scanf(“%d”,&n);
for(int i=1;i<=n;i++)scanf(“%d%d”,&x[i],&y[i]);
}
只能过第一个数据
好的,我看看
Sorry写作业耽误了下,发现你是最后几行的那个
s=max(s, maxs);
出问题了~改完了,这个代码可以AC
orz,跪谢大佬
hh,加油!
作者你好,我是一个小白,我好奇为什么&a[i]可以点first和second是什么东西啊,怎么来的啊
好的,这个是STL数据库中的pair,详细的你可以看下链接:
https://blog.csdn.net/lemonxiaoxiao/article/details/121207648
万分感谢
嗯嗯,加油!
为什么if (i == j || i == k || j == k) 就continue?
三角形的三个点相互不能重和,i,j,k三重循环分别代表三个顶点。
懂了,谢谢
嗯嗯
pair是个好东西。Orz
如果三个for循环那里改成j=i+1,k=j+1为啥会结果为0。按理这样不是更便捷,不用判断是否重复使用了吗
这是个好问题,我想想
哦懂了,因为题目中的数据不符合我代码定义的要求,然而
i=1; j=1; k=1
的代码可以打乱一下它的顺序,那么就可以得出正确结果哦哦,我懂了,这个方法判断三角形是存在局限性的,必须判断nnn次才可以。如果按+1就是判断n(n-1)(n-2)次,判断条件就要增加。谢谢了大佬!
嗯嗯!加油!
continue那一行注释掉也可以ac,是不是直接判断点坐标间的关系也可以
continue注释也可以AC的原因是这样至少有两个点重合,那么三角形的面积为0,肯定是会被其他答案更新的。
受教了🤝
a[i].first == a[j].first && a[j].second == a[k].second
为什么一定要判断直角三角形?
因为要按照题目要求呀!
谢谢 是我审题有问题
对整体取一个abs就行了,不用取两遍
ans = max(ans, abs((a[i].second - a[j].second) * (a[i].first - a[k].first)));
哦哦感谢