#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
#define INF 50005
struct Node
{
double x, y;
};
Node point[INF];
int n, s[INF], top;
double cross(Node a, Node b, Node c)
{
double x1 = a.x - c.x;
double y1 = a.y - c.y;
double x2 = b.x - c.x;
double y2 = b.y - c.y;
return x1 * y2 >= x2 * y1;
}
double dis(Node a, Node b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int cmp(Node a, Node b)
{
if(a.y==b.y)
return a.x<b.x;
return a.y<b.y;
}
void graham()
{
int i;
sort(point, point+n, cmp);
top = 1;
s[0] = 0;
s[1] = 1;
s[2] = 2;
for (i=2; i<n; i++)
{
while (top && cross(point[i], point[s[top]], point[s[top-1]]))
top--;
s[++top] = i;
}
int len = top;
s[++top] = n - 2;
for (i=n-3; i>=0; i--)
{
while (len!=top && cross(point[i], point[s[top]], point[s[top-1]]))
top--;
s[++top] = i;
}
}
int main()
{
int i, j;
while (scanf("%d", &n)!=EOF)
{
for (i=0; i<n; i++)
scanf("%lf%lf", &point[i].x, &point[i].y);
if (n<3)
printf("%.lf\n", dis(point[0], point[1]));
else
{
graham();
double ans = 0;
for(i = 0; i < top-1; i ++)
for(j = i+1; j < top; j ++)
ans = max(ans, dis(point[s[i]], point[s[j]]));//G++用%f
printf("%.lf\n", ans);
}
}
return 0;
}
再一次遇到这一题时,相同的代码wrong到死
在老师的帮助下找到原因
如果输出的是小数,在G++用"%f"输出就能AC,而用"%lf"输出就会WA,而C++就没这个问题。
ISO C只允许用%f输出小数,%lf属于非标准用法。( http://poj.org/page?id=1000 Other questions一节)
ISO C只允许用%f输出小数,%lf属于非标准用法。( http://poj.org/page?id=1000 Other questions一节)