返回信息流1037解题报告
由于多边形所有的边都和广场的平行,所以的任意两条边的关系是平行或者垂直。所以我们就可以通过先求出所有的
水平边的长度总和,再求出所有的垂直边的长度。
求水平边的长度时,可以将所有的点排序,排序的方式是按照每个点的 y 坐标来排序,如果 y 坐标相等那么就按照 x 坐标来排序。然后将序列的每两个相邻的作为一组(一共 N 个点那么分成 N/2 组),然后计算它们之间的距离。
同理可求得所有竖直边的长度之和。最后两者相加即可。
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #5135同步于 2007/3/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
[解题报告]1037 Pluto部落的传说II-残暴的酋长
hhllnnnn
2007/3/14镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
帖下我的程序,不知道错在哪了,求人帮忙看看
程序如下:
#include <iostream>
using namespace std;
struct Point
{
int X;
int Y;
};
inline bool IsUpper(const Point *p1, const Point *p2)
{
if(p1->Y > p2->Y)
return true;
if(p1->Y == p2->Y)
{
if(p1->X > p2->X) return true;
else return false;
}
return false;
}
inline bool IsRight(const Point *p1, const Point *p2)
{
if(p1->X > p2->X) return true;
if(p1->X == p2->X)
{
if(p1->Y > p2->Y) return true;
else return false;
}
return false;
}
int main(void)
{
int numPoint = 0;
cin >> numPoint;
Point **pPoint = new Point*[numPoint];
int i = 0;
int x = 0, y = 0;
for(i = 0; i < numPoint; i++)
{
cin >> x >> y;
Point *p = new Point;
p->X = x;
p->Y = y;
pPoint[i] = p;
}
// Sort, the first one with the smallest Y
for(i = 1; i < numPoint; i++)
{
Point *p = 0;
for(int j = i; j > 0 && IsUpper(pPoint[j - 1], pPoint[j]); j--)
{
p = pPoint[j - 1];
pPoint[j - 1] = pPoint[j];
pPoint[j] = p;
}
}
unsigned int s = 0; // distance
int numPoint1 = numPoint/2;
for(i = 0; i < numPoint1; i++)
s += (pPoint[2*i + 1]->X - pPoint[2*i]->X);
// Sort, the first one with the smallest X
for(i = 1; i < numPoint; i++)
{
Point *p = 0;
for(int j = i; j > 0 && IsRight(pPoint[j - 1], pPoint[j]); j--)
{
p = pPoint[j - 1];
pPoint[j - 1] = pPoint[j];
pPoint[j] = p;
}
}
for(i = 0; i < numPoint1; i++)
s += (pPoint[2*i + 1]->Y - pPoint[2*i]->Y);
cout << s << endl;
delete[] pPoint;
pPoint = 0;
return 0;
}
【 在 hhllnnnn 的大作中提到: 】
: 1037解题报告
: 由于多边形所有的边都和广场的平行,所以的任意两条边的关系是平行或者垂直。所以我们就可以通过先求出所有的
: 水平边的长度总和,再求出所有的垂直边的长度。
: ...................
就是这了,看的不仔细
谢谢啦
[em68]
【 在 hhllnnnn 的大作中提到: 】
: 你好!
: 你的程序只能完成单组输入,而我们的测试数据有多组数据。
: 你应该这样:
: ...................