prolem 452B B. 4-point polylin
题目大意就是给一个点坐标 由这个点与原点所组成的长方形或者线段中选取四个点 组成三条线段 使得这三条线段长度和最大
看到样例反映就是如果给的坐标如果在坐标轴上(假设m=0) 就选取(0,0)(n-1,0)(1,0)(n,0)这四个点
如果都不等于0 就选取(0,0)(n,m)(0,m)(n,0)(假设n>m)
但是怎么写都过不了TEST 3
那也是相当郁闷 然后今早看别人的题解才知道还有别的情况 就是距离原点距离为1的点跟距离点(n,m)距离为1的点(水平或者垂直方向上)
看了别人的思路。。自己写的代码还是各种出错。。。代码能力啊 不能手残啊。。。。
代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#define eps 1e-7
#define op operator
#define MOD 10009
#define MAXN 10000
using namespace std;
int dis(int x1,int y1,int x2,int y2)
{
int d=(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
return d;
}
int main()
{
//freopen("ceshi.txt","r",stdin);
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
bool flag=0;//记录n m有木有交换
if(m>n)
{
swap(n,m);
flag=1;
}
int x1,y1,x2,y2,x3,y3,x4,y4;
if(m==0)
{
x1=1;y1=0;
x2=n;y2=0;
x3=0;y3=0;
x4=n-1;y4=0;
}
else
{
int dis1=2*dis(0,0,n,m)+n*n;
int dis2=2*dis(0,0,n,m-1)+dis(0,0,n,m);
if(dis1-dis2<0&&m>1)
{
x1=0;y1=1;
x2=n;y2=m;
x3=0;y3=0;
x4=n;y4=m-1;
}
else
{
x1=n;y1=m;
x2=0;y2=0;
x3=n;y3=0;
x4=0;y4=m;
}
}
if(flag)
{
swap(x1,y1);
swap(x2,y2);
swap(x3,y3);
swap(x4,y4);
}
printf("%d %d\n",x1,y1);
printf("%d %d\n",x2,y2);
printf("%d %d\n",x3,y3);
printf("%d %d\n",x4,y4);
}
return 0;
}