题目描述
在三角形范围内(包括边界和定点)给定了三个顶点A ,B ,C;
求满足3|OA|+2|OB|+|OC|最小的点O处;
O,A,B,C均为整点。
输入
输入数据仅一行六个整数,分别代表点A B C 的横纵坐标。
输出
输出两个整数,为点O的坐标,如果有多个满足题意的解,则输出任意一个即可。
样例输入
0 1 0 0 2 0
样例输出
0 1
提示
三角形中的整点共有4个:(0,1),(0,0),(1,0),(2,0) 其中,(0,1)点作为点O可使得3|OA|+2|OB|+|OC|取得最小值。
来源
2020 ICPC 济南站 网络选拔赛
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()//锐角三角形内的点,x坐标取值为三个顶点x坐标最小值与最大值之间
{ //y坐标取值为三个顶点y坐标最小值与最大值之间
int x[3],y[3],x1,x2,y1,y2,i,j,m,n;
float min,f;
for(i=0;i<3;i++)
{
scanf("%d%d",&x[i],&y[i]);
}
x1=x[0];//作为三个顶点中x最小值
x2=x[0];//x最大值
y1=y[0];//y最小值
y2=y[0];//y最大值
for(i=1;i<3;i++)
{
if(x1>x[i])
{
x1=x[i];
}
if(x2<x[i])
{
x2=x[i];
}
if(y1>y[i])
{
y1=y[i];
}
if(y2<y[i])
{
y2=y[i];
}
}
m=x1;//先随意记录一个三角形内的坐标与3|OA|+2|OB|+|OC|的值min
n=y1;//然后令min与三角形内各坐标带入所取的值比较、交换,并更新点O坐标(m,n)
min=3*sqrt(pow(y[0]-y1,2)+pow(x[0]-x1,2))+2*sqrt(pow(y[1]-y1,2)+pow(x[1]-x1,2))+sqrt(pow(y[2]-y1,2)+pow(x[2]-x1,2));
for(i=x1;i<=x2;i++)
{
for(j=y1;j<=y2;j++)
{
f=3*sqrt(pow(y[0]-j,2)+pow(x[0]-i,2))+2*sqrt(pow(y[1]-j,2)+pow(x[1]-i,2))+sqrt(pow(y[2]-j,2)+pow(x[2]-i,2));
if(min>f)
{
min=f;
m=i;
n=j;
}
}
}
printf("%d %d",m,n);
return 0;
}