poj2187 凸包直径模板

来源:互联网 发布:广联达软件官方下载 编辑:程序博客网 时间:2024/06/02 20:09
#include <iostream>#include <cmath>#include <algorithm>#include <cstdio>using namespace std;#define INF 50005struct 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一节)



0 0
原创粉丝点击