- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 codeforces 中有一个作业,上面写着:
像所有问题解决者一样,Ebram 喜欢吃可丽饼!众所周知,可丽饼通常呈三角形。现在 Ebram 想知道绉纱面可以有多大!于是他试着用三个点在一个平面上画一个三角形,并计算三角形三边的最大长度。但有时他会睡着,因为他一直忙于团队准备训练问题!这样一来,他用的三个点未必能组成一个可以代表薄饼的三角形!只有面积为正数的三角形才能代表一 block 绉纱。所以你是来帮助 Ebram 的!给定 Ebram 使用的坐标,确定它们是否形成可以代表一 block 绉纱的三角形。
输入:代表 Ebram 使用的三个点的三个整数坐标 (X,Y)。每个点在一条单独的线上。
输出:如果点组成一个三角形可以代表一 block 可丽饼,打印三角形三边最大长度的正方形。否则打印“可怜的男孩”
示例
input
1 1
3 1
3 9
output
68
input
-10 8
9 100
3 8
output
8825
input
7 3
3 3
19 3
output
Poor boy
这是我使用的代码:
#include <iostream>
#include <cmath>
using namespace std;
int main () {
double x1,y1,x2,y2,x3,y3;
double area;
double s1,s2,s3;
double slope1, slope2;
cin >> x1 >> y1;
cin >> x2 >> y2;
cin >> x3 >> y3;
slope1 =((y2-y1)/(x2-x1));
slope2 =((y3-y2)/(x3-x2));
area = 0.5*abs(((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)));
if (slope1!=slope2 && (area)!=0){
s1 = sqrt(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)));
s2 = sqrt(((x2-x3)*(x2-x3))+((y2-y3)*(y2-y3)));
s3 = sqrt(((x1-x3)*(x1-x3))+((y1-y3)*(y1-y3)));
if (s1 > s2 && s1 > s3)
cout<<s1*s1<<endl;
if (s2 > s1 && s2 > s3)
cout<<s2*s2<<endl;
if (s3 > s1 && s3 > s2)
cout <<s3*s3<<endl;
}
else
cout <<"Poor boy";
return 0;
}
首先我找到 slope1 和 slope2 来检查这三个点是否不在同一条线上。所以如果它们不相等,它就会形成一个三角形(绉纱)。使用这个:
slope1 =((y2-y1)/(x2-x1));
slope2 =((y3-y2)/(x3-x2));
然后我用这个公式写了一个求三角形面积的关系:
area = 0.5*abs(((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)));
最后,我使用 if 语句来判断它是否是三角形,并求出三角形每条边的长度,然后求出最大长度并打印出它的平方。
if (slope1!=slope2 && (area)!=0){
s1 = sqrt(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)));
s2 = sqrt(((x2-x3)*(x2-x3))+((y2-y3)*(y2-y3)));
s3 = sqrt(((x1-x3)*(x1-x3))+((y1-y3)*(y1-y3)));
if (s1 > s2 && s1 > s3)
cout<<s1*s1<<endl;
if (s2 > s1 && s2 > s3)
cout<<s2*s2<<endl;
if (s3 > s1 && s3 > s2)
cout <<s3*s3<<endl;
}
else
cout <<"Poor boy";
return 0;
}
我在我的编译器中测试了代码,它运行示例中显示的 i/o 非常好。我在 codeforces 上提交了代码,但我不知道为什么在测试 8 中卡住了错误的答案,我的代码运行输入和输出正常。如果你能帮助大家,我会很高兴。
最佳答案
如 Sani 的回答,我建议计算每对点之间的上升和运行:
rise1 = y2 - y1
rise2 = y3 - y2
rise3 = y1 - y3
run1 = x2 - x1
run2 = x3 - x2
run3 = x1 - x3
同样,我建议检查任意两点是否重合。请注意,这等同于 Sani 的代码正在检查的内容:
if (rise1 = run1 = 0) or (rise2 = run2 = 0) or (rise3 = run3 = 0) then
print "Poor Boy"
return 0
现在,与 Sani 类似,我们继续检查点是否在一条线上。但是,我们可以简化条件以进行一些检查。请注意,如果没有两点在一条垂直线上,则如果任意两点之间的斜率相等,则这三个点在一条线上。即,m1 = m2,m2 = m3,或 m3 = m1,等价。我们可以检查是否 m1 = m2。当 rise1/run1 = rise2/run2 时是这样,这是安全的,因为我们假设没有点在垂直线上。我们可以再次安全地将其重新排列为 rise1 * run2 = rise2 * run1。如果没有两点在垂直线上,这是我们唯一需要的检查。
如果两点在一条垂直线上怎么办?那么 run1 和 run2 中至少有一个将为零。但是,因为我们已经保证没有两个点是重合的,所以我们可以绝对确定,如果其中任何一个为零,则相应的上升不为零。还有另外两种情况(除了没有两点在一条垂直线上):
恰好有两点在一条垂直线上。然后 run1 或 run2 为零,但不是两者都为零。不失一般性,假设 run1 为零。然后条件 rise1 * run2 = rise2 * run1 简化为 rise1 * run2 = 0。因为我们知道 rise1 不为零,所以只有当 run2 = 0 时才满足,这与我们的假设情况相矛盾。这意味着,在这种情况下,我们之前得出的条件将产生正确的结果并将这些点识别为不在同一条线上。
三个点在一条垂直线上。那么 run1 和 run2 都为零。然后条件 rise1 * run2 = rise2 * run1 简化为 0 = 0,这始终为真。在这种情况下,条件将产生正确的结果并将三个点识别为在同一条线上。
因为我们针对垂直线上没有两点的情况得出的条件恰好对所有其他可能的情况产生正确的结果,所以我们可以在所有情况下使用它(在没有两点重合的假设下)。因此,我们不需要检查任何东西,除了 rise1 * run2 = rise2 * run1:
if rise1 * run2 = rise2 * run1 then
print "Poor Boy"
return 0
现在我们知道我们有一个三角形,需要返回三个边中最大的一个。我们需要各个坐标的平方差之和。幸运的是,我们已经有了坐标差异,所以:
d1 = (rise1 * rise1) + (run1 * run1)
d2 = (rise2 * rise2) + (run2 * run2)
d3 = (rise3 * rise3) + (run3 * run3)
return max(d1, d2, d3)
关于c++ - 使用三个点(x,y),如何判断它是不是三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47677676/
我刚刚编写了这些代码,但输出不同。第二个代码的输出符合我的预期,但第一个代码的输出不正确。但为什么呢? def fib(n): x = 0 y = 1 print x
#include #include #define CUBE(y)y*(y*y) main() { int j; j = CUBE(-2+4);
这个问题在这里已经有了答案: Multiple assignment and evaluation order in Python (11 个答案) 关闭 1 年前。 我看到下面的代码,但不知道它做
我正在阅读 book , 并讲了 typeclass Eq 的定义 有两个功能== , /=在等式中,它们被实现为: x == y = not (x /= y) x /= y = not (
我最近参加了一个代码力量竞赛。在比赛的编辑部分,我看到了按位运算符之间的一种美妙关系,即 x + y = x & y + x |是的我还不知道证据。我拿了几个数字来看看这个等式是否正确。我很高兴知道这
我使用 CGRectMake(x,x,x,x) 在我的 View 中放置了一个按钮,当然 x 是位置和大小。当我使用 -(BOOL)shouldAutoRotate... 旋转 View 时,我想将按
this.x = (Math.random()*canvasWidth); this.y = (Math.random()*canvasHeight); (1) this.shift = {x: th
我想将此代码运行为“if 'Britain' or 'UK' in string do stuff, but don't do stuff if "Ex UK" 在字符串中": #Case insen
早上好,我是新来的,我带来了一个小问题。我无法针对以下问题开发有效的算法:我需要找到三个正数 x、y 和 z 的组合,以便 x + y、x - y、y + z、y - z、x + z 和 x - z
我现在正在使用 C++ 编写方案的解释器。我有一个关于定义和 lambda 的问题。 (define (add x y) (+ x y)) 扩展为 (define add (lambda (x y)
我正在尝试使用一台主机通过 FTP 将内容上传到另一台主机。 “我不会打开到 172.xxx.xxx.xxx(仅到 54.xxx.xxx.xxx)的连接”甚至不相关,因为我没有连接到那个主持人。这是托
在 Python 中,使用 [] 解包函数调用有什么区别? , 与 ()还是一无所有? def f(): return 0, 1 a, b = f() # 1 [a, b] = f() # 2
给定方程 z = z(x,y) 2 个表面 I和 II : z_I(x, y) = a0 + a1*y + a2*x + a3*y**2 + a4*x**2 + a5*x*y z_II(x, y)
几年前我有这个面试问题,但我还没有找到答案。 x 和 y 应该是什么才能形成无限循环? while (x = y && x != y) { } 我们尝试了 Nan,infinity+/-,null f
我正在尝试使用 Camel FTP Producer 将文件发送到第三方 ftp 服务器(似乎由 Amazon 托管),但遇到了一个问题,写入文件失败,并显示:文件操作失败...主机尝试数据连接 x.
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我正在使用 torch.tensor.repeat() x = torch.tensor([[1, 2, 3], [4, 5, 6]]) period = x.size(1) repeats = [1
#include int main() { int x = 9; int y = 2; int z = x - (x / y) * y; printf("%d", z
我很难理解先有定义然后有两个异或表达式的含义。这个定义的作用是什么? 我尝试发送 x=8, y=7,结果是 x=15 和 y=8为什么会这样? 这是程序: #define FUNC(a,b) a^=b
我正在尝试使用 SIMD 优化此功能,但我不知道从哪里开始。 long sum(int x,int y) { return x*x*x+y*y*y; } 反汇编函数如下所示: 4007a0
我是一名优秀的程序员,十分优秀!