锘??xml version="1.0" encoding="utf-8" standalone="yes"?>99久久婷婷国产综合精品草原,久久久久人妻一区精品,97久久久久人妻精品专区http://www.shnenglu.com/csu-yx-2013/category/19663.htmlAlgorithm Study And So Onzh-cnSun, 15 Sep 2013 10:06:12 GMTSun, 15 Sep 2013 10:06:12 GMT60poj 2187 Beauty Contesthttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/23/184784.htmlyxyxMon, 23 Jul 2012 14:18:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/23/184784.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/184784.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/23/184784.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/184784.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/184784.html澶氭銆傚悗闈㈡眰鍑稿寘鎹簡(jiǎn)縐嶇畻娉曡繃浜?jiǎn)銆傜粨鏋滃彂鐜癰ug鏄悶娣蜂簡(jiǎn)鏁扮粍鍚嶏紝鐒跺悗鎶婂墠闈a鎺夌殑浠g爜涓嬭澆涓嬫潵錛屾敼濂戒箣鍚庝篃閮借繃浜?jiǎn)銆?br />   榪欎釜棰樹(shù)富瑕佹槸鍑稿寘綆楁硶闇瑕佸鐞嗘湁閲嶅鐐癸紝鏈夊鐐瑰叡綰夸箣綾葷殑鎯呭喌銆傞偅涓寜鏋佽鎺掑簭鍚庯紝鍐嶆眰鍑稿寘鐨勭畻娉曪紝瀵瑰叡鐐瑰叡綰垮鐞嗙殑涓嶆槸寰堝ソ錛?br />涓嶈繃閭d釜綆楁硶涔熻繃浜?jiǎn)杩欎釜棰樸傛湁涓洿鎺ユ寜鍧愭爣鎺掑簭鍚庯紝鍐嶆眰涓婂嚫鍖呭拰涓嬪嚫鍖呯殑綆楁硶錛屽彲浠ュ鐞嗗叡鐐瑰叡綰跨殑鎯呭喌銆傝繖涓畻娉曟瘮杈冧紭緹庡晩錛屾棦涓?br />闇瑕佹壘y鍧愭爣鏈灝忕殑鐐癸紝涔熶笉闇瑕佹寜鏋佽鎺掑簭錛岀洿鎺ユ寜鍧愭爣鎺掑簭涓嬶紝鐒跺悗姹傚嚫鍖呭嵆鍙?br />   榪欎釜綆楁硶鐨勪竴鐐硅В閲婏細(xì)http://www.algorithmist.com/index.php/Monotone_Chain_Convex_Hull
   鍙﹀錛屾紨綆楁硶絎旇錛?a >http://www.csie.ntnu.edu.tw/~u91029/ConvexHull.html#a3涓婁篃鏈夋彁鍒拌繖涓畻娉曪紝鎴戜篃鏄粠榪欎笂闈㈢湅鍒扮殑銆?br />榪欎釜綆楁硶鍙互鍋囪鏄疓raham鎺掑簭鍩哄噯鐐瑰湪鏃犻檺榪滃錛屼簬鏄す瑙掑ぇ灝忕殑姣旇緝鍙互鐩存帴鎸夋按騫沖潗鏍囨瘮杈冦?br />
浠g爜濡備笅錛?br />
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
struct Point
{
    int x, y;
    bool operator<(const Point& p) const
    {
        return x < p.x || x == p.x && y < p.y;
    }
};
Point pts[50100];
Point pcs[50100];
int nN;
int nM;
inline int SDis(const Point& a, const Point& b)
{
    return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}

double Det(double fX1, double fY1, double fX2, double fY2)
{
    return fX1 * fY2 - fX2 * fY1;
}

double Cross(Point a, Point b, Point c)
{
    return Det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y);
}

void Convex()
{
    sort(pts, pts + nN);
 
    nM = 0;
    for (int i = 0; i < nN; ++i)
    {
        while(nM >= 2 && Cross(pcs[nM - 2], pcs[nM - 1], pts[i]) <= 0)
        {
            nM--;
        }
        pcs[nM++] = pts[i];
    }
    for (int i= nN - 2, t = nM + 1; i >= 0; --i)
    {
        while (nM >= t && Cross(pcs[nM - 2], pcs[nM - 1], pts[i]) <= 0)
        {
            nM--;
        }
        pcs[nM++] = pts[i];
    }
    nM--;//璧風(fēng)偣浼?xì)琚噸澶嶅寘鍚?/span>
}

int main()
{
    while (scanf("%d", &nN) == 1)
    {
        for (int i = 0; i < nN; ++i)
        {
            scanf("%d%d", &pts[i].x, &pts[i].y);
        }
        Convex();
        int nMax = -1;
        for (int i = 0; i < nM; ++i)
        {
            for (int j = i + 1; j < nM; ++j)
            {
                nMax = max(nMax, SDis(pcs[i], pcs[j]));
            }
        }
        printf("%d\n", nMax);
    }
    
    return 0;
}
   涔熷彲浠ョ敤鏃嬭漿鍗″3綆楁硶鏉ユ眰鏈榪滅偣瀵癸紝姝ら鐨勫畬鏁翠唬鐮佸涓嬶細(xì)
#include <stdio.h> 
#include <string.h>
#include <math.h>
#include <vector>
#include <algorithm>
using namespace std;

struct Point
{
    int x, y;
    bool operator < (const Point& p)const
    {
        return x < p.x || x == p.x && y < p.y;
    }
};

double Det(double fX1, double fY1, double fX2, double fY2)
{
    return fX1 * fY2 - fX2 * fY1;
}

double Cross(Point a, Point b, Point c)
{
    return Det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y);
}

//杈撳叆鐐歸泦鍚?杈撳嚭鍑稿寘
void Convex(vector<Point>& in, vector<Point>& out)
{
    int nN = in.size();
    int nM = 0;

    sort(in.begin(), in.end());
    out.resize(nN);
    
    for (int i = 0; i < nN; ++i)
    {
        while (nM >= 2 && Cross(out[nM - 2], out[nM - 1], in[i]) <= 0)
        {
            nM--;
        }
        out[nM++] = in[i];
    }

    for (int i = nN - 2, t = nM + 1; i >= 0; --i)
    {
        while (nM >= t && Cross(out[nM - 2], out[nM - 1], in[i]) <= 0)
        {
            nM--;
        }
        out[nM++] = in[i];
    }
    out.resize(nM);
    out.pop_back();//璧峰鐐歸噸澶?/span>
}

int SDis(Point a,Point b)
{
    return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}

int RC(vector<Point>& vp)
{
    int nP = 1;
    int nN = vp.size();
    vp.push_back(vp[0]);
    int nAns = 0;
    for (int i = 0; i < nN; ++i)
    {
        while (Cross(vp[i], vp[i + 1], vp[nP + 1]) > Cross(vp[i], vp[i + 1], vp[nP]))
        {
            nP = (nP + 1) % nN;
        }
        nAns = max(nAns, max(SDis(vp[i], vp[nP]), SDis(vp[i + 1], vp[nP + 1])));
    }
    vp.pop_back();
    return nAns;
}

int main()
{
    int nN;
    vector<Point> inout;
    Point p;
    while (scanf("%d", &nN) == 1)
    {
        in.clear(), out.clear();
        while (nN--)
        {
            scanf("%d%d", &p.x, &p.y);
            in.push_back(p);
        }
        Convex(inout);
        
        printf("%d\n", RC(out));
    }

    return 0;
}
   鍏充簬鏃嬭漿鍗″3鐨勭畻娉曟弿榪幫紝緗戜笂鏈夊緢澶氳祫鏂欙紝姣斿錛?a href="http://www.shnenglu.com/staryjy/archive/2010/09/25/101412.html">http://www.shnenglu.com/staryjy/archive/2010/09/25/101412.html 
灝ゅ叾鍏充簬榪欎釜姹傛渶榪滅偣瀵圭殑銆?span id="Code_Closed_Text_130220" style="border: 1px solid #808080; background-color: #ffffff; display: none; ">


yx 2012-07-23 22:18 鍙戣〃璇勮
]]>
poj 3525 Most Distant Point from the Seahttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/23/184746.htmlyxyxMon, 23 Jul 2012 08:45:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/23/184746.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/184746.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/23/184746.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/184746.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/184746.html鏄劇劧鍙互瀵瑰渾鐨勫崐寰勮繘琛屼簩鍒嗭紝浣嗘槸鎬庝箞紜畾鍦嗗績(jī)浜?jiǎn)銆傜‘瀹氭槸鍚﹀瓨鍦ㄥ渾蹇?jī)锛屽彲浠ユ妸鍘熸潵鐨勫嚫澶氳竟迮炲線鍐呴儴縐誨姩r錛堝渾鐨勫崐寰勶級(jí)鐨勮窛紱諱箣鍚庯紝
鍐嶅鏂扮殑澶氳竟褰㈡眰鍗婂鉤闈氦錛屽鏋滃崐騫抽潰浜ゅ瓨鍦紙鏄釜鐐瑰嵆鍙級(jí)錛岄偅涔堝綋鍓嶅ぇ灝忕殑鍦嗚兘澶熸斁鍏ャ?br />   姹傚崐騫抽潰浜ょ殑綆楁硶鍙互鐢ㄤ笂涓綃囦腑鐨凬*N澶嶆潅搴︾殑鍩烘湰綆楁硶銆傛湰棰樿繕娑夊強(qiáng)鍒頒竴涓煡璇嗭紝灝辨槸濡備綍鎶婁竴鏉$洿綰垮線閫嗘椂閽堟柟鍚戞垨鑰呴『鏃墮拡鏂瑰悜
縐誨姩R鐨勮窛紱匯傚叾瀹烇紝鍙互鏍規(guī)嵁鍗曚綅鍦嗛偅縐嶆濊礬璁$畻銆傚洜涓虹浉褰撲簬浠ュ師鏉ョ洿綰夸笂鐨勪竴鐐逛負(fù)鍦嗗績(jī)錛屼互r涓哄崐寰勫仛鍦嗭紝鑰屼笖涓庡師鏉ョ殑鐩寸嚎鎴?0鐨勫す
瑙掞紝閭d箞鍚庢潵鐐圭殑鍧愭爣鏄紙(x0 + cos(PI / 2 +θ ))錛岋紙y0 + sin(PI / 2 + θ))錛夛紝杞寲涓涓嬪氨鏄?x0 - sinθ錛寉0 + cosθ)銆傞偅涔堢洿鎺ュ彲浠?br />姹傚嚭dx = / (vp[i].y - vp[(i + 1) % nN].y) * fR / fDis錛宒y = (vp[(i + 1) % nN].x - vp[i].x) * fR / fDis錛宖Dis鏄嚎孌電殑闀垮害銆?br />   
   浠g爜濡備笅錛?br />
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <vector>
using namespace std;

const double fPre = 1e-8;

struct Point
{
    double x,y;
    Point(){}
    Point(const Point& p){x = p.x, y = p.y;}
    Point(double fX, double fY):x(fX), y(fY){}
    Point& operator+(const Point& p)
    {
        x += p.x;
        y += p.y;
        return *this;
    }
    Point& operator+=(const Point& p)
    {
        return *this = *this + p;
    }
    
    Point& operator-(const Point& p)
    {
        x -= p.x;
        y -= p.y;
        return *this;
    }
    Point& operator*(double fD)
    {
        x *= fD;
        y *= fD;
        return *this;
    }
};
typedef vector<Point> Polygon;
int DblCmp(double fD)
{
    return fabs(fD) < fPre ? 0 : (fD > 0 ? 1 : -1);
}

double Cross(Point a, Point b)
{
    return a.x * b.y - a.y * b.x;
}

double Det(double fX1, double fY1, double fX2, double fY2)
{
    return fX1 * fY2 - fX2 * fY1;
}

double Cross(Point a, Point b, Point c)
{
    return Det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y);
}

Point Intersection(Point a1, Point a2, Point b1, Point b2)
{
    Point a = a2 - a1;
    Point b = b2 - b1;
    Point s = b1 - a1;
    return a1 + a * (Cross(b, s) / Cross(b, a));
}

Polygon Cut(Polygon& pg, Point a, Point b)
{
    Polygon pgRet;
    int nN = pg.size();
    
    for (int i = 0; i < nN; ++i)
    {
        double fC = Cross(a, b, pg[i]);
        double fD = Cross(a, b, pg[(i + 1) % nN]);
        
        if (DblCmp(fC) >= 0)
        {
            pgRet.push_back(pg[i]);
        }
        if (DblCmp(fC * fD) < 0)
        {
            pgRet.push_back(Intersection(a, b, pg[i], pg[(i + 1) % nN]));
        }
    }
    //printf("pgRet number:%d\n", pgRet.size());
    return pgRet;
}

double Dis(Point a, Point b)
{
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
//榪斿洖鍗婂鉤闈㈢殑欏剁偣涓暟
int HalfPlane(Polygon& vp, double fR)
{
    Polygon pg;
    pg.push_back(Point(-1e9, -1e9));
    pg.push_back(Point(1e9, -1e9));
    pg.push_back(Point(1e9, 1e9));
    pg.push_back(Point(-1e9, 1e9));
    int nN = vp.size();
    for (int i = 0; i < nN; ++i)
    {
        double fDis = Dis(vp[i], vp[(i + 1) % nN]);
        double dx = (vp[i].y - vp[(i + 1) % nN].y) * fR / fDis;
        double dy = (vp[(i + 1) % nN].x - vp[i].x) * fR / fDis;
        Point a = vp[i], b = vp[(i + 1) % nN], c(dx, dy);
        a += c;
        b += c;
        //printf("%f %f %f %f\n", a.x, a.y, b.x, b.y);
        pg = Cut(pg, a, b);
        if (pg.size() == 0)
        {
            return 0;
        }
    }
    return pg.size();
}
 
int main()
{
    int nN;
    vector<Point> vp;
    
    while (scanf("%d", &nN), nN)
    {
        vp.clear();
        Point p;
        for (int i = 0; i < nN; ++i)
        {
            scanf("%lf%lf", &p.x, &p.y);
            vp.push_back(p);
        }
        double fMin = 0.0, fMax = 10000.0;
        while (DblCmp(fMin - fMax))
        {
            double fMid = (fMin + fMax) / 2;
            int nRet = HalfPlane(vp, fMid);
            //printf("fMid:%f, nRet:%d\n", fMid, nRet);
            if (nRet == 0)
            {
                fMax = fMid;
            }
            else
            {
                fMin = fMid;
            }
        }
        printf("%.6f\n", fMax);
    }
    
    return 0;
}


yx 2012-07-23 16:45 鍙戣〃璇勮
]]>
poj 3130 How I Mathematician Wonder What You Are!http://www.shnenglu.com/csu-yx-2013/archive/2012/07/23/184701.htmlyxyxMon, 23 Jul 2012 02:41:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/23/184701.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/184701.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/23/184701.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/184701.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/184701.html灝卞鍘熸潵姹傚嚭鐨勫崐騫抽潰浜よ繘琛屽鐞嗭紝浜х敓鏂扮殑鏍稿績(jī)銆?br />   浠g爜鍙傜収鍙版咕鐨勪竴涓綉绔欐紨綆楁硶絎旇涓婄殑鍐呭鍜屼唬鐮併傝〃紺鴻繖涓綉绔欏法涓嶉敊錛屾眰鍑稿寘鐨勭畻娉曚篃鍙傜収浜?jiǎn)杩欎釜缃戠珯涓婄殑鍐呭鍜屼唬鐮併?br />鍗婂鉤闈氦鐨勫湴鍧錛?a >http://www.csie.ntnu.edu.tw/~u91029/Half-planeIntersection.html#a4
   
   浠g爜鎬濊礬涓昏鏄細(xì)鍏堣鍏ユ墍鏈夌殑澶氳竟褰㈤《鐐癸紝鏀懼叆涓涓獀ector錛坴p錛夐噷闈紝鐒跺悗瀵瑰杈瑰艦鐨勬瘡鏉¤竟姹備竴涓崐騫抽潰銆傚垰寮濮嬬殑鏃跺欙紝鐢ㄤ竴涓?br />vector錛圥olygon錛変繚瀛樹(shù)唬琛ㄤ笂涓嬪乏鍙沖洓涓棤闄愯繙瑙掔殑鍥涗釜鐐癸紝琛ㄧず鍘熷鐨勫崐騫抽潰銆傜劧鍚庯紝鐢ㄨ鍏ョ殑澶氳竟褰㈢殑姣忔潯杈瑰幓鍒囧壊鍘熸潵鐨勫崐騫抽潰銆?br />鍒囧壊鐨勮繃紼嬫槸錛屽鏋滃師鏉ワ紙Polygon錛変腑鐨勭偣鍦ㄥ綋鍓嶇洿綰跨殑鎸囧畾涓渚э紝閭d箞鍘熸潵鐨勭偣榪樻槸鏈夋晥鐨勩傚鏋滃師鏉ョ殑鐐瑰拰瀹冪浉閭?cè)潥勪笅涓涓偣涓庡綋鍓?br />鐩寸嚎鐩鎬氦錛岄偅涔堣繕闇瑕佹妸浜ょ偣鍔犲叆Polygon闆嗗悎銆?br />   榪樻湁姹備氦鐐圭殑鏂規(guī)硶姣旇緝濂囪懇錛岀被浼間簬榛戜功涓婇潰鐨勯偅縐嶆牴鎹潰縐瓑鍒嗙殑鏂規(guī)硶銆?br />
   浠g爜濡備笅錛?br />
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <algorithm>
using namespace std;

double fPre = 1e-8;
struct Point
{
    double x;
    double y;
    Point(){}
    Point(double fX, double fY)
    {
        x = fX, y = fY;
    }
};
typedef vector<Point> Polygon;
typedef pair<Point, Point> Line;
Point operator+(const Point& a, const Point& b)
{
    Point t;
    t.x = a.x + b.x;
    t.y = a.y + b.y;
    return t;
}

Point operator-(const Point& a, const Point& b)
{
    Point t;
    t.x = a.x - b.x;
    t.y = a.y - b.y;
    return t;
}

Point operator*(Point a, double fD)
{
    Point t;
    t.x = a.x * fD;
    t.y = a.y * fD;
    return t;
}

int DblCmp(double fD)
{
    return fabs(fD) < fPre ? 0 : (fD > 0 ? 1 : -1);
}

double Det(double fX1, double fY1, double fX2, double fY2)
{
    return fX1 * fY2 - fX2 * fY1;
}
//3鐐瑰弶縐?/span>
double Cross(Point a, Point b, Point c)
{
    return Det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y);
}
//鍚戦噺鍙夌Н
double Cross(Point a, Point b)
{
    return a.x * b.y - a.y * b.x;
}

//姹傜洿綰夸氦鐐圭殑涓縐嶇畝渚挎柟娉?br />//騫寵鍥涜竟褰㈤潰縐殑姣斾緥絳変簬楂樼殑姣斾緥
Point Intersection(Point a1, Point a2, Point b1, Point b2)
{
    Point a = a2 - a1;
    Point b = b2 - b1;
    Point s = b1 - a1;
    
    return a1 + a * (Cross(b, s) / Cross(b, a));
}

Polygon HalfPlane(Polygon& pg, Point a, Point b)
{
    Polygon pgTmp;
    int nN = pg.size();
    for (int i = 0; i < nN; ++i)
    {
        double fC = Cross(a, b, pg[i]);
        double fD = Cross(a, b, pg[(i + 1) % nN]);
        if (DblCmp(fC) >= 0)
        {
            pgTmp.push_back(pg[i]);
        }
        if (fC * fD < 0)
        {
            pgTmp.push_back(Intersection(a, b, pg[i], pg[(i + 1) % nN]));
        }
    }
    return pgTmp;
}

int main()
{
    int nN;
    Point p;
    vector<Point> vp;
    Polygon pg;
    
    while (scanf("%d", &nN), nN)
    {
        vp.clear();
        for (int i = 0; i < nN; ++i)
        {
            scanf("%lf%lf", &p.x, &p.y);
            vp.push_back(p);
        }
        pg.clear();
        pg.push_back(Point(-1e9, 1e9));
        pg.push_back(Point(-1e9, -1e9));
        pg.push_back(Point(1e9, -1e9));
        pg.push_back(Point(1e9, 1e9));
        for (int i = 0; i < nN; ++i)
        {
            pg = HalfPlane(pg, vp[i], vp[(i + 1) % nN]);
            if (pg.size() == 0)
            {
                printf("0\n");
                break;
            }
        }
        if (pg.size())
        {
            printf("1\n");
        }
    }

    return 0;
}


yx 2012-07-23 10:41 鍙戣〃璇勮
]]>
poj 1584 A Round Peg in a Ground Holehttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/20/184396.htmlyxyxFri, 20 Jul 2012 13:41:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/20/184396.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/184396.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/20/184396.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/184396.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/184396.html絎笁涓槸姹備竴涓偣鍒頒竴鏉$嚎孌碉紙鎴栬呰鐩寸嚎錛夌殑璺濈錛岀鍥涗釜鏄垽鏂竴涓渾鏄惁鍒欎竴涓嚫澶氳竟褰㈠唴閮ㄣ?br />   鍏跺疄錛屾垜鏄鍒ゆ柇涓涓渾鏄惁鍒欎竴涓嚫澶氳竟褰㈠唴閮ㄨ岀敤鍒扮畻娉曚簩鍜屼笁銆傚叾瀹烇紝鏈変笉闇瑕佸垽鏂渾蹇?jī)鏄惁鍒欏杈瑰舰鍐呴儴鐨劷帡娉曘?br />   綆楁硶涓鐨勬濇兂錛屾眰鎵鏈夎竟鐨勫亸杞柟鍚戯紝蹇呴』閮芥槸閫嗘椂閽堟垨鑰呴『鏃墮拡鍋忚漿銆傜畻娉曚簩鍒欐槸鎴戝墠闈㈠彂鐨勯偅綃囨敼榪涘姬闀挎硶鍒ゆ柇鐐瑰拰澶氳竟褰㈢殑鍏崇郴錛?br />綆楁硶涓夊挨鍏剁畝鍗曪紝鐩寸嚎涓婇潰鍙?鐐癸紝鐢ㄥ弶縐眰鍑?guó)櫩欎笁鐐规瀯鎴愮殑涓夎迮為潰绉?鍊嶏紝鍐嶉櫎浠ュ簳杈廣傜畻娉曞洓鍒欐槸鍏堝垽鏂渾蹇?jī)鍦ㄥ杈瑰舰鍐呴儴锛岀劧鍚?br />鍒ゆ柇鍦嗗績(jī)鍒版墍鏈夎竟鐨勮窛紱昏澶т簬鍦嗙殑鍗婂緞銆?br />   璐村嚭浠g爜錛岀函綺逛負(fù)浜?jiǎn)浠ュ悗浣滀负妯$増鋴社敤绛夊Q岄槻姝㈤仐蹇橈紝鏂逛究鏌ユ壘錛屽叾瀹炵幇鍦ㄤ篃鑳芥墜鏁插嚭鏉ヤ簡(jiǎn)銆?br />
 浠g爜濡備笅錛?div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <vector>
using namespace std;

const double fPre = 1e-8;
int DblCmp(double fD)
{
    if (fabs(fD) < fPre)
    {
        return 0;
    }
    else
    {
        return fD > 0 ? 1 : -1;
    }
}

struct Point
{
    double x, y;
    bool operator == (const Point& p)
    {
        return DblCmp(x - p.x) == 0 && DblCmp(y - p.y) == 0;
    }
};

Point operator-(const Point& a, const Point& b)
{
    Point p;
    p.x = a.x - b.x;
    p.y = a.y - b.y;
    return p;
}

double Det(double fX1, double fY1, double fX2, double fY2)
{
    return fX1 * fY2 - fX2 * fY1;
}

double Cross(Point a, Point b, Point c)
{
    return Det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y);
}

bool IsConvexPolygon(vector<Point>& vp)
{
    int nN = vp.size();
    int nDirection = 0;
    bool bLine = true;//閬垮厤鎵鏈夌偣鍏辯嚎
    for (int i = 0; i < nN; ++i)
    {
        int nTemp = DblCmp(Cross(vp[i], vp[(i + 1) % nN], vp[(i + 2) % nN]));
        if (nTemp)
        {
            bLine = false;
        }
        //榪欐鐨勬柟鍚戝拰涓婃鐨勬柟鍚戝繀欏繪槸鐩稿悓鐨勬垨鑰呮槸3鐐瑰拰3鐐逛互涓婂叡綰跨殑鎯呭喌
        if (nDirection * nTemp < 0)
        {
            return false;
        }
        nDirection = nTemp;
    }
    return bLine == false;
}

int GetQuadrant(Point p)
{
    return p.x >= 0 ? (p.y >= 0 ? 0 : 3) : (p.y >= 0 ? 1 : 2);
}

bool IsPtInPolygon(vector<Point>& vp, Point p)
{
    int nN = vp.size();
    int nA1, nA2, nSum = 0;
    int i;
    
    nA1 = GetQuadrant(vp[0] - p);
    for (i = 0; i < nN; ++i)
    {
        int j = (i + 1) % nN;
        if (vp[i] == p)
        {
            break;
        }
        int nC = DblCmp(Cross(p, vp[i], vp[j]));
        int nT1 = DblCmp((vp[i].x - p.x) * (vp[j].x - p.x));
        int nT2 = DblCmp((vp[i].y - p.y) * (vp[j].y - p.y));
        if (!nC && nT1 <= 0 && nT2 <= 0)
        {
            break;
        }
        nA2 = GetQuadrant(vp[j] - p);
        switch ((nA2 - nA1 + 4) % 4)
        {
            case 1:
                nSum++;
                break;
            case 2:
                if (nC > 0)
                {
                    nSum += 2;
                }
                else
                {
                    nSum -= 2;
                }
                break;
            case 3:
                nSum--;
                break;
        }
        nA1 = nA2;
    }
    
    if (i < nN || nSum)
    {
        return true;
    }
    return false;
}

double PtDis(Point a, Point b)
{
    return sqrt((a.x - b.x) * (a.x - b.x) + (b.y - a.y) * (b.y - a.y));
}
//鐐筽鍒扮洿綰縜b鐨勮窛紱?br />//h = (2 * Spab) / |ab|
double GetDis(Point a, Point b, Point p)
{
    return fabs(Cross(a, b, p)) / PtDis(a, b);
}

bool IsCircleInPolygon(vector<Point>& vp, Point p, double fR)
{
    if (!IsPtInPolygon(vp, p))
    {
        return false;
    }
    
    int nN = vp.size();
    for (int i = 0; i < nN; ++i)
    {
        if (GetDis(vp[i], vp[(i + 1) % nN], p) < fR)
        {
            return false;
        }
    }
    return true;
}

int main()
{
    int nN;
    double fR, fPx, fPy;
    vector<Point> vp;
    Point p;
    
    while (scanf("%d%lf%lf%lf", &nN, &fR, &fPx, &fPy), nN >= 3)
    {
        vp.clear();
        for (int i = 0; i < nN; ++i)
        {
            scanf("%lf%lf", &p.x, &p.y);
            vp.push_back(p);
        }
        
        if (IsConvexPolygon(vp))
        {
            p.x = fPx;
            p.y = fPy;
            if (IsCircleInPolygon(vp, p, fR))
            {
                printf("PEG WILL FIT\n");
            }
            else
            {
                printf("PEG WILL NOT FIT\n");
            }
        }
        else
        {
            printf("HOLE IS ILL-FORMED\n");
        }
    }
    
    return 0;
}

yx 2012-07-20 21:41 鍙戣〃璇勮
]]>
poj 1265 Areahttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/20/184357.htmlyxyxFri, 20 Jul 2012 07:36:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/20/184357.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/184357.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/20/184357.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/184357.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/184357.html瀹氱悊銆傛牴鎹墠闈?涓俊鎭拰pick瀹氱悊綆楀嚭鍦ㄥ杈瑰艦鍐呴儴鐨勬暣鐐圭殑涓暟銆?br />   姹傚杈瑰艦闈㈢Н鐨勬柟娉曡繕鏄弶縐唬琛ㄦ湁鍚戦潰縐殑鍘熺悊錛屾妸鍘熺偣鐪嬪仛鍙﹀鐨勪竴涓偣鍘誨垎鍓插師鏉ョ殑澶氳竟褰負(fù)N涓笁瑙掑艦錛岀劧鍚庢妸瀹冧滑鐨勬湁鍚戦潰
縐姞璧鋒潵銆?br />   鍒ゆ柇杈圭晫涓婄偣鐨勪釜鏁版槸鏍規(guī)嵁Gcd錛坉x,dy)浠h〃褰撳墠杈逛笂鏁存暟鐐圭殑涓暟鐨勭粨璁恒傝繖涓粨璁虹殑璇佹槑鍏跺疄涔熸瘮杈冪畝鍗曪紝鍋囪dx = a錛宒y = b銆?br />鍒濆鐐規(guī)槸x0錛寉0錛屽亣璁綿 = Gcd錛坅錛宐錛夈傞偅涔堣竟涓婄殑鐐瑰彲浠ヨ琛ㄧず涓猴紙x0 + k * (a / d)錛寉0 + k * 錛坆 / d))銆備負(fù)浜?jiǎn)鋴社傄?guī)槸鏁存暟鐐癸紝
k蹇呴』鏄暣鏁幫紝鑰屼笖0<= k <=d錛屾墍浠ユ渶澶氭湁d涓繖涓殑鐐廣?br />   姹傚杈瑰艦鍐呴儴鐐圭殑涓暟鐢ㄧ殑鏄痯ick瀹氱悊銆傞潰縐?= 鍐呴儴鐐?+ 杈圭晫鐐?/ 2 - 1銆?br />   
   浠g爜濡備笅錛?br />
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define MAX (100 + 10)

struct Point
{
    double x, y;
};
Point pts[MAX];

int nN;
const int IN = 1;
const int EAGE = 2;
const int OUT = 3;
const double fPre = 1e-8;

double Det(double fX1, double fY1, double fX2, double fY2)
{
    return fX1 * fY2 - fX2 * fY1;
}

double Cross(Point a, Point b, Point c)
{
    return Det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y);
}

double GetArea()
{
    double fArea = 0.0;
    Point ori = {0.0, 0.0};

    for (int i = 0; i < nN; ++i)
    {
        fArea += Cross(ori, pts[i], pts[(i + 1) % nN]);
    }
    return fabs(fArea) * 0.5;
}

int gcd(int nX, int nY)
{
    if (nX < 0)
    {
        nX = -nX;
    }
    if (nY < 0)
    {
        nY = -nY;
    }
    if (nX < nY)
    {
        swap(nX, nY);
    }
    while (nY)
    {
        int nT = nY;
        nY = nX % nY;
        nX = nT;
    }
    return nX;
}

int main()
{
    int nT;
    int nI, nE;
    double fArea;

    scanf("%d", &nT);
    int dx ,dy;
    
    for (int i = 1; i <= nT; ++i)
    {
        scanf("%d", &nN);
        nI = nE = 0;
        pts[0].x = pts[0].y = 0;
        for (int j = 1; j <= nN; ++j)
        {
            scanf("%d%d", &dx, &dy);
            pts[j].x = pts[j - 1].x + dx;
            pts[j].y = pts[j - 1].y + dy;
            nE += gcd(dx, dy);
        }
        fArea = GetArea();
        nI = (fArea + 1) - nE / 2;
        printf("Scenario #%d:\n%d %d %.1f\n\n", i, nI, nE, fArea);
    }

    return 0;
}


yx 2012-07-20 15:36 鍙戣〃璇勮
]]>
zoj 1081 Points Within - 鏀硅繘寮ч暱娉曞垽鏂偣鍜岀畝鍗曞杈瑰艦鐨勫叧緋?/title><link>http://www.shnenglu.com/csu-yx-2013/archive/2012/07/20/184308.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Fri, 20 Jul 2012 02:30:00 GMT</pubDate><guid>http://www.shnenglu.com/csu-yx-2013/archive/2012/07/20/184308.html</guid><wfw:comment>http://www.shnenglu.com/csu-yx-2013/comments/184308.html</wfw:comment><comments>http://www.shnenglu.com/csu-yx-2013/archive/2012/07/20/184308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/csu-yx-2013/comments/commentRss/184308.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/csu-yx-2013/services/trackbacks/184308.html</trackback:ping><description><![CDATA[   杞娉曞垽鏂偣鍜屽杈瑰艦鐨勫叧緋誨ぇ瀹墮兘鐭ラ亾錛屽師鐞嗘瘮杈冪畝鍗曪紝鍦ㄥ杈瑰艦鍐呮壂榪囩殑杞涓瀹氭槸360搴︼紝鍦ㄨ竟鐣屼笂鍜屽闈㈠垯涓嶄竴瀹氥?br /> 瀹炵幇璧鋒潵涔熸瘮杈冮夯鐑?chǔ)锛寢巩鐐硅宸瘮杈冨ぇ锛岃屼笖榪樿鑰冭檻浜涚壒孌婃儏鍐點(diǎn)?br />   鍦ㄧ綉涓婃壘鍒頒竴縐嶅彨鍋氭敼榪涘姬闀挎硶鐨勭畻娉曪紝鍘熺悊鍜岃漿瑙掓硶綾諱技錛屼絾鏄仛浜?jiǎn)寰堝閲嶈鐨勬敼杩涖傛瘮濡傦紝璁$畻杞鏀規(guī)垚浜?jiǎn)璁〗帡鍙壙U紝鏍規(guī)嵁鍙夌Н鍐沖畾<br />鏃嬭漿鏂瑰悜錛岃繕瑕佹牴鎹綆椾笅涓涓偣鐨勮薄闄愬喅瀹氬亸杞灝戯紝姣忔鍋忚漿鐨勯兘鏄?0搴︾殑鍊嶆暟銆?br />   璇ョ畻娉曞彲浠ユ柟渚垮垽鏂嚭鐐瑰湪澶氳竟褰㈠唴錛岃繕鏄竟鐣屼笂錛岃繕鏄湪澶氳竟褰㈠闈€?br /><br />   鎽樿嚜鍒漢瀵硅綆楁硶鐨勬弿榪板涓嬶細(xì)<br />   <span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">棣栧厛浠庤涔︿腑鎽樻妱涓孌靛姬闀挎硶鐨勪粙緇嶏細(xì)“寮ч暱娉曡姹傚杈瑰艦鏄湁鍚戝杈瑰艦錛屼竴鑸</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">瀹氭部澶氳竟褰㈢殑姝e悜錛岃竟鐨勫乏渚т負(fù)澶氳竟褰㈢殑鍐呬晶鍩熴?br />浠ヨ嫻嬬偣涓哄渾蹇?jī)浣滃崟浣嶅渾锛尀畣鍏ㄩ儴鏈夊?/span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">杈瑰悜鍗曚綅鍦嗕綔寰勫悜鎶曞獎(jiǎng)錛屽茍璁$畻鍏朵腑鍗曚綅鍦嗕笂寮ч暱鐨勪唬鏁板拰銆傝嫢浠f暟鍜屼負(fù)0錛屽垯鐐瑰湪澶氳竟褰?/span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">澶栭儴錛?br />鑻ヤ唬鏁板拰涓?π鍒欑偣鍦ㄥ杈瑰艦鍐呴儴錛涜嫢浠f暟鍜屼負(fù)π錛屽垯鐐瑰湪澶氳竟褰笂銆?#8221;</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />   <span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">鎸変功涓婄殑榪欎釜浠嬬粛錛屽叾瀹炲姬闀挎硶灝辨槸杞娉曘備絾瀹冪殑鏀硅繘鏂規(guī)硶姣旇緝鍘夊錛氬皢鍧愭爣鍘?/span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">鐐瑰鉤縐誨埌琚祴鐐筆錛岃繖涓柊鍧愭爣緋誨皢騫抽潰鍒掑垎涓?涓?br />璞¢檺錛屽姣忎釜澶氳竟褰㈤《鐐筆 錛屽彧鑰冭檻</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">鍏舵墍鍦ㄧ殑璞¢檺錛岀劧鍚庢寜閭繪帴欏哄簭璁塊棶澶氳竟褰㈢殑鍚勪釜欏剁偣P錛屽垎鏋怭鍜孭[i+1]錛屾湁涓嬪垪</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">涓夌鎯呭喌錛?/span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">錛?錛塒[i+1]鍦≒鐨勪笅涓璞¢檺銆傛鏃跺姬闀垮拰鍔?#960;/2錛?/span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">錛?錛塒[i+1]鍦≒鐨勪笂涓璞¢檺銆傛鏃跺姬闀垮拰鍑?#960;/2錛?/span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">錛?錛塒[i+1]鍦≒i鐨勭浉瀵硅薄闄愩傞鍏堣綆梖=y[i+1]*x-x[i+1]*y錛堝弶縐級(jí)錛岃嫢f=</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">0錛屽垯鐐瑰湪澶氳竟褰笂錛涜嫢f<0錛屽姬闀垮拰鍑?#960;錛涜嫢f>0錛屽姬闀垮拰鍔?#960;銆?/span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />   <span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">鏈鍚庡綆楀嚭鐨勪唬鏁板拰鍜屼笂榪扮殑鎯呭喌涓鏍峰垽鏂嵆鍙?/span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />   <span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">瀹炵幇鐨勬椂鍊欒繕鏈変袱鐐硅娉ㄦ剰錛岀涓涓槸鑻鐨勬煇涓潗鏍囦負(fù)0鏃訛紝涓寰嬪綋姝e彿澶勭悊錛?/span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">絎簩鐐規(guī)槸鑻ヨ嫻嬬偣鍜屽杈瑰艦鐨勯《鐐歸噸鍚堟椂瑕佺壒孌婂鐞嗐?br /></span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />   <span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">浠ヤ笂灝辨槸涔︿笂璁茶В鐨勫唴瀹癸紝鍏跺疄榪樺瓨鍦ㄤ竴涓棶棰樸傞偅灝辨槸褰撳杈瑰艦鐨勬煇鏉¤竟鍦ㄥ潗鏍?/span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">杞翠笂鑰屼笖涓や釜欏剁偣鍒嗗埆鍦ㄥ師鐐圭殑涓や晶鏃朵細(xì)鍑洪敊銆?br />濡傝竟(3,0)-(-3,0)錛屾寜浠ヤ笂鐨勫鐞嗭紝璞¢檺</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">鍒嗗埆鏄涓鍜岀浜岋紝榪欐牱浼?xì)鋴射唬鏁板拰鍔?#960;/2錛屾湁鍙兘瀵艱嚧鏈鍚庣粨鏋滄槸琚祴鐐瑰湪澶氳竟褰㈠銆?/span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">鑰屽疄闄呬笂<br />琚祴鐐規(guī)槸鍦ㄥ杈瑰艦涓婏紙璇ヨ竟絀胯繃璇ョ偣錛夈?/span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />   <span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">瀵逛簬榪欑偣錛屾垜鐨勫鐞嗗姙娉曟槸錛氭瘡嬈$畻P鍜孭[i+1]鏃訛紝灝辮綆楀弶縐拰鐐圭Н錛屽垽鏂</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">鐐規(guī)槸鍚﹀湪璇ヨ竟涓婏紝鏄垯鍒ゆ柇緇撴潫錛屽惁鍒欑戶(hù)緇笂榪拌繃紼嬨?br />榪欐牱鐗虹壊浜?jiǎn)鏃堕椷_(dá)紝浣嗕繚璇佷簡(jiǎn)姝g‘鎬?/span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">銆?/span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />   <span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">鍏蜂綋瀹炵幇鐨勬椂鍊欙紝鐢變簬鍙渶鐭ラ亾褰撳墠鐐瑰拰涓婁竴鐐圭殑璞¢檺浣嶇疆錛屾墍浠ラ檮鍔犵┖闂村彧闇O(</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">1)銆傚疄鐜扮殑鏃跺欏彲浠ユ妸涓婅堪鐨?#8220;π/2”鏀規(guī)垚1錛?#8220;π”鏀規(guī)垚2錛?br />榪欐牱渚垮彲浠ュ畬鍏ㄤ嬌鐢ㄦ暣鏁拌繘</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">琛岃綆椼備笉蹇呰冭檻欏剁偣鐨勯『搴忥紝閫嗘椂閽堝拰欏烘椂閽堥兘鍙互澶勭悊錛屽彧鏄渶鍚庣殑浠f暟鍜岀鍙蜂笉鍚?/span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">鑰屽凡銆傛暣涓畻娉曠紪鍐?br />璧鋒潵闈炲父瀹規(guī)槗銆?br /><br />浠g爜濡備笅錛?br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include <stdio.h><br />#include <math.h><br /><br /><span style="color: #0000FF; ">#define</span> MAX (100 + 10)<br /><span style="color: #0000FF; ">struct</span> Point<br />{<br />    <span style="color: #0000FF; ">double</span> x,y;<br />};<br /><br />Point pts[MAX];<br /><span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">int</span> OUT = 0;<br /><span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">int</span> IN = 1;<br /><span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">int</span> EDGE = 2;<br /><span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">double</span> fPre = 1e-8;<br /><br /><span style="color: #0000FF; ">int</span> DblCmp(<span style="color: #0000FF; ">double</span> fD)<br />{<br />    <span style="color: #0000FF; ">if</span> (fabs(fD) < fPre)<br />    {<br />        <span style="color: #0000FF; ">return</span> 0;<br />    }<br />    <span style="color: #0000FF; ">else</span><br />    {<br />        <span style="color: #0000FF; ">return</span> fD > 0 ? 1 : -1;<br />    }<br />}<br /><br /><span style="color: #0000FF; ">int</span> GetQuadrant(Point p)<br />{<br />    <span style="color: #0000FF; ">return</span> DblCmp(p.x) >= 0 ? (DblCmp(p.y) >= 0 ? 0 : 3) :<br />               (DblCmp(p.y) >= 0 ? 1 : 2);<br />}<br /><br /><span style="color: #0000FF; ">double</span> Det(<span style="color: #0000FF; ">double</span> fX1, <span style="color: #0000FF; ">double</span> fY1, <span style="color: #0000FF; ">double</span> fX2, <span style="color: #0000FF; ">double</span> fY2)<br />{<br />    <span style="color: #0000FF; ">return</span> fX1 * fY2 - fX2 * fY1;<br />}<br /><br /><span style="color: #0000FF; ">int</span> PtInPolygon(Point* pts, <span style="color: #0000FF; ">int</span> nN, Point p)<br />{<br />    <span style="color: #0000FF; ">int</span> i, j, k;<br />    <span style="color: #0000FF; ">for</span> (j = 0; j < nN; ++j)<br />    {<br />        pts[j].x -= p.x;<br />        pts[j].y -= p.y;<br />    }<br />    <span style="color: #0000FF; ">int</span> nA1, nA2;<br />    <span style="color: #0000FF; ">int</span> nSum = 0;<br />    nA1 = GetQuadrant(pts[0]);<br />    <span style="color: #0000FF; ">for</span> (i = 0; i < nN; ++i)<br />    {<br />        k = (i + 1) % nN;<br />        <span style="color: #0000FF; ">if</span> (DblCmp(pts[k].x) == 0 && DblCmp(pts[k].y) == 0)<br />        {<br />            <span style="color: #0000FF; ">break</span>;<span style="color: #008000; ">//</span><span style="color: #008000; ">涓庨《鐐歸噸鍚?/span><span style="color: #008000; "><br /></span>        }<br />        <span style="color: #0000FF; ">int</span> nC = DblCmp(Det(pts[i].x, pts[i].y,<br />                            pts[k].x, pts[k].y));<br />        <span style="color: #0000FF; ">if</span> (!nC && DblCmp(pts[i].x * pts[k].x) <= 0<br />                && DblCmp(pts[i].y * pts[k].y) <= 0)<br />        {<br />            <span style="color: #0000FF; ">break</span>;<span style="color: #008000; ">//</span><span style="color: #008000; ">杈逛笂</span><span style="color: #008000; "><br /></span>        }<br />        nA2 = GetQuadrant(pts[k]);<br />        <span style="color: #0000FF; ">if</span> ((nA1 + 1) % 4 == nA2)<br />        {<br />            nSum += 1;<br />        }<br />        <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span> ((nA1 + 2) % 4 == nA2)<br />        {<br />            <span style="color: #0000FF; ">if</span> (nC > 0)<br />            {<br />                nSum += 2;<br />            }<br />            <span style="color: #0000FF; ">else</span><br />            {<br />                nSum -= 2;<br />            }<br />        }<br />        <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span> ((nA1 + 3) % 4 == nA2)<br />        {<br />            nSum -= 1;<br />        }<br />        nA1 = nA2;<br />    }<br />    <br />    <span style="color: #0000FF; ">for</span> (j = 0; j < nN; ++j)<br />    {<br />        pts[j].x += p.x;<br />        pts[j].y += p.y;<br />    }<br />    <br />    <span style="color: #0000FF; ">if</span> (i < nN)<br />    {<br />        <span style="color: #0000FF; ">return</span> EDGE;<br />    }<br />    <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span> (nSum)<span style="color: #008000; ">//</span><span style="color: #008000; ">閫嗘椂閽坣Sum == 4, 欏烘椂閽坣Sum == -4</span><span style="color: #008000; "><br /></span>    {<br />        <span style="color: #0000FF; ">return</span> IN;<br />    }<br />    <span style="color: #0000FF; ">else</span><br />    {<br />        <span style="color: #0000FF; ">return</span> OUT;<br />    }<br />}<br /><br /><span style="color: #0000FF; ">int</span> main()<br />{<br />    <span style="color: #0000FF; ">int</span> nN, nM;<br />    <span style="color: #0000FF; ">int</span> nCase = 1;<br /><br />    <span style="color: #0000FF; ">while</span> (scanf("%d%d", &nN, &nM), nN)<br />    {<br />        <span style="color: #0000FF; ">if</span> (nCase > 1)<br />        {<br />            printf("\n");<br />        }<br />        <br />        <span style="color: #0000FF; ">for</span> (<span style="color: #0000FF; ">int</span> i = 0; i < nN; ++i)<br />        {<br />            scanf("%lf%lf", &pts[i].x, &pts[i].y);<br />        }<br />        printf("Problem %d:\n", nCase++);<br />        <span style="color: #0000FF; ">for</span> (<span style="color: #0000FF; ">int</span> i = 0; i < nM; ++i)<br />        {<br />            Point p;<br />            scanf("%lf%lf", &p.x, &p.y);<br />            <span style="color: #0000FF; ">if</span> (PtInPolygon(pts, nN, p))<br />            {<br />                printf("Within\n");<br />            }<br />            <span style="color: #0000FF; ">else</span><br />            {<br />                printf("Outside\n");<br />            }<br />        }<br />    }<br /><br />    <span style="color: #0000FF; ">return</span> 0;<br />}</div><img src ="http://www.shnenglu.com/csu-yx-2013/aggbug/184308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/csu-yx-2013/" target="_blank">yx</a> 2012-07-20 10:30 <a href="http://www.shnenglu.com/csu-yx-2013/archive/2012/07/20/184308.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>poj 3348 Cowshttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/18/184112.htmlyxyxWed, 18 Jul 2012 12:28:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/18/184112.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/184112.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/18/184112.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/184112.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/184112.html褰紝涓鑸槸鍋囪鎸夐『搴忓彇澶氳竟褰笂闈㈣繛緇殑2鐐逛笌鍘熺偣緇勫悎鎴愪竴涓笁瑙掑艦錛屼緷嬈′笅鍘葷敤鍙夌Н姹傛湁鍚戦潰縐箣鍜岋紝鏈鍚庡彇緇濆鍊煎嵆鍙傛敞鎰忥紝榪欎簺
鐐瑰繀欏繪槸鍦ㄥ杈瑰艦涓婇嗘椂閽堟垨鑰呴『鏃墮拡緇欏嚭鐨勶紝鑰屾眰鍑哄嚫鍖呭垰濂界粰浜?jiǎn)杩欐狅L(fēng)殑涓緋誨垪鐐廣?br />   鍑稿寘浠g爜錛屽叾瀹炲厛鎵懼嚭涓涓獃鍧愭爣鏈灝忕殑鐐癸紝鍐嶅鍓╀笅鐨勬墍鏈夌偣鎸夋瀬瑙掓帓搴忋傜劧鍚庡鎺掑簭鍚庣殑鐐硅繘琛屼竴涓簩緇村驚鐜嵆鍙備簩緇村驚鐜殑瑙i噴鏄?br />褰撳姞鍏ユ柊鐨勭偣榪涘叆鍑稿寘闆嗗悎鏃跺欙紝濡傛灉涓庝互鍓嶅姞鍏ョ殑鐐瑰艦鎴愮殑鍋忚漿鏂瑰悜涓嶄竴鑷達(dá)紝閭d箞鍓嶉潰閭d簺鐐歸兘闇瑕佸脊鍑洪泦鍚堛?br />
   浠g爜濡備笅錛?br />
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define MAX_N (10000 + 10)

struct Point
{
    double x, y;
    bool operator <(const Point& p) const
    {
        return y < p.y || y == p.y && x < p.x;
    }
};

Point pts[MAX_N];
int nN;
Point ans[MAX_N];
int nM;

double Det(double fX1, double fY1, double fX2, double fY2)
{
    return fX1 * fY2 - fX2 * fY1;
}

double Cross(Point a, Point b, Point c)
{
    return Det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y);
}

bool CrossCmp(const Point& a, const Point& b)
{
    double cs = Cross(pts[0], a, b);
    return cs > 0 || cs == 0 && a.x < b.x; 
}

void Scan()
{
    nM = 0;
    sort(pts + 1, pts + nN, CrossCmp);//瀵規(guī)墍鏈夌偣鎸夋瀬瑙掓帓搴?閫嗘椂閽堝亸杞?br />    
    
//絎?-2涓偣錛屽叾瀹炰笉浼?xì)杩涘叆绗簩閲嶅惊鐜?br />    //浠庣3涓偣寮濮嬶紝灝變緷嬈℃鏌ヤ笌鍑稿寘涓墠闈㈢偣褰㈡垚鐨勮竟鐨勫亸杞柟鍚?br />    //濡傛灉涓嶆槸閫嗘椂閽堝亸杞紝鍒欏脊鍑?guó)櫙ョ?/span>
    for (int i = 0; i < nN; ++i)
    {
        while (nM >= 2 && Cross(ans[nM - 2], ans[nM - 1], pts[i]) <= 0)
        {
            nM--;
        }
        ans[nM++] = pts[i];
    }
}

double GetArea()
{
    double fAns = 0.0;
    Point ori = {0.0, 0.0};
    for (int i = 0; i < nM; ++i)
    {
        fAns += Cross(ori, ans[i], ans[(i + 1) % nM]);
    }
    return fabs(fAns) * 0.5;
}

int main()
{
    while (scanf("%d", &nN) == 1)
    {
        for (int i = 0; i < nN; ++i)
        {
            scanf("%lf%lf", &pts[i].x, &pts[i].y);
            if (pts[i] < pts[0])
            {
                swap(pts[i], pts[0]);//pts[0]鏄痽鍧愭爣鏈灝忕殑鐐?/span>
            }
        }
        
        Scan();//鎵弿鍑哄嚫鍖?/span>
        double fArea = GetArea();
        printf("%d\n", (int)(fArea / 50));
    }
    
    return 0;
}


yx 2012-07-18 20:28 鍙戣〃璇勮
]]>
poj 3714 Raid and hdu 1007 Quoit Designhttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/18/184049.htmlyxyxWed, 18 Jul 2012 05:53:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/18/184049.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/184049.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/18/184049.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/184049.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/184049.html鎶婂悓綾誨埆鐐圭洿鎺ョ殑璺濈閮藉綋浣淚NF澶勭悊鍗沖彲銆?br />   鏈榪戠偣瀵圭殑綆楁硶錛岀畻瀵間笂闈㈣鏄痭logn鐨勩備絾鏄繖涓鏉傚害瀹炵幇璧鋒潵鐣ュ井楹葷儲(chǔ)鐐癸紝鏈変竴縐嶅疄鐜版柟娉曟槸n*logn*logn鐨勶紝鍏跺彧瀵箈鍧愭爣榪涜
浜?jiǎn)鎺掑簭銆俷*logn鐨勭畻娉曢渶瑕佸x鍜寉鍒嗛噺鍒嗗埆榪涜鎺掑簭錛岃繕闇瑕佺敤鍒板叾瀹冪殑杈呭姪鏁扮粍銆?br />   絎竴涓鎴戠敤浜?jiǎn)n*logn綆楁硶瀹炵幇浜?jiǎn)锛尳W簩涓鍒欑敤浜?jiǎn)n*logn*logn綆楁硶瀹炵幇浜?jiǎn)銆備絾鏄椂闂翠笂鐩稿樊涓嶅ぇ錛屽洜涓虹涓涓畻娉曟瘡嬈¤繘琛屽垎娌繪椂
鍊欐秷鑰楃殑O(n)鏃墮棿涔熸湁鍑犳銆傜浜屼釜綆楁硶鍒嗘不鏃跺欙紝闇瑕佸啀嬈℃帓搴忕殑鏃墮棿涔熶笉涓瀹氬緢澶氾紝鍥犱負(fù)鍙兘鏁版嵁閲忎笉澶熷ぇ銆?br />   綆楁硶鐨勬湰璐ㄥ氨鏄簩鍒嗘寜鐓鎺掑簭濂界殑鐐規(guī)暟緇勶紝n*logn*logn鍙樻垚n*logn鐨勫叧閿槸棰勫厛瀵箉涔熸帓搴忓ソ涓涓偣鏁扮粍錛屽洜涓烘寜y鎺掑簭濂界殑鐐規(guī)暟緇勶紝
鍦ㄥ垎娌誨悗鐨勫悎騫朵腑瑕佺敤鍒般傜畻娉曟洿璇︾粏鐨勮В閲婅鍙傜収綆楁硶瀵艱銆?br />
poj 3714 浠g爜濡備笅錛?/span> 

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define MAX_N (100000 * 2 + 10)
const double FINF = 1LL << 60;
struct Point
{
    double x, y;
    int nKind;
};
Point pts[MAX_N], ptsY[MAX_N], ptsTemp[MAX_N];
Point ptsSave[MAX_N];
int nNum;
bool CmpX(const Point& a, const Point& b)
{
    return a.x < b.x;
}

bool CmpY(const Point& a, const Point& b)
{
    return a.y < b.y;
}

double Dis(Point a, Point b)
{
    if (a.nKind == b.nKind)
    {
        return FINF;
    }
    else
    {
        return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
    }
}

double FindMinDis(Point pts[], Point ptsY[], Point ptsTemp[], int nBeg, int nEnd)
{
    if (nBeg == nEnd)
    {
        return FINF;
    }
    else if (nBeg + 1 == nEnd)
    {
        return Dis(pts[nBeg], pts[nEnd]);
    }
    else if (nBeg + 2 == nEnd)
    {
        return min(min(Dis(pts[nBeg], pts[nBeg + 1]), Dis(pts[nBeg], pts[nEnd])),
                   Dis(pts[nBeg + 1], pts[nEnd]));
    }
    else
    {
        memcpy(ptsSave + nBeg, ptsY + nBeg, sizeof(Point) * (nEnd - nBeg + 1));//淇濆瓨褰撳墠鐨刌鍧愭爣欏哄簭
        int nMid = (nBeg + nEnd) / 2;
        int nL = nBeg;
        int nR = nMid + 1;
        for (int i = nBeg; i <= nEnd; ++i)
        {
            if (ptsY[i].x - pts[nMid].x <= 0)
            {
                ptsTemp[nL++] = ptsY[i];
            }
            else
            {
                ptsTemp[nR++] = ptsY[i];
            }
        }
        
        double fAns = min(FindMinDis(pts, ptsTemp, ptsY, nBeg, nMid),
                          FindMinDis(pts, ptsTemp, ptsY, nMid + 1, nEnd));
        int nK = 1;
        
        for (int i = nBeg; i <= nEnd; ++i)
        {
            if (fabs(ptsSave[i].x - pts[nMid].x) <= fAns)
            {
                ptsTemp[nK++] = ptsSave[i];
            }
        }
        for (int i = 1; i < nK; ++i)
        {
            for (int j = i + 1; j < nK; ++j)
            {
                if (ptsTemp[j].y - ptsTemp[i].y > fAns)
                {
                    break;
                }
                fAns = min(fAns, Dis(ptsTemp[i], ptsTemp[j]));
            }
        }
        return fAns;
    }
}

int main()
{
    int nT;
    int nN;
    
    //printf("%f", FINF);
    scanf("%d", &nT);
    while (nT--)
    {
        scanf("%d", &nN);
        nNum = nN * 2;
        for (int i = 0; i < nN; ++i)
        {
            scanf("%lf%lf", &pts[i].x, &pts[i].y);
            pts[i].nKind = 1;
        }
        for (int i = nN; i < nNum; ++i)
        {
            scanf("%lf%lf", &pts[i].x, &pts[i].y);
            pts[i].nKind = 2;
        }
        memcpy(ptsY, pts, sizeof(Point) * nNum);
        sort(pts, pts + nNum, CmpX);
        sort(ptsY, ptsY + nNum, CmpY);
        printf("%.3f\n", FindMinDis(pts, ptsY, ptsTemp, 0, nNum - 1));
    }
    
    return 0;
}

hdu 1007 浠g爜濡備笅錛?br />
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define MAX (100000 + 10)
struct Point
{
    double x, y;
};
Point pts[MAX];
Point ptsTemp[MAX];
const double FINF = 1LL << 60;
bool CmpX(const Point& a, const Point& b)
{
    return a.x < b.x;
}

bool CmpY(const Point& a, const Point& b)
{
    return a.y < b.y;
}

double Dis(Point a, Point b)
{
    return sqrt((a.x - b.x) * (a.x - b.x) + (b.y - a.y) * (b.y - a.y));
}

double Find(int nL, int nH)
{
    if (nL == nH)
    {
        return FINF;
    }
    else if (nL + 1 == nH)
    {
        return Dis(pts[nL], pts[nH]);
    }
    else if (nL + 2 == nH)
    {
        return min(Dis(pts[nL], pts[nL + 1]), 
                   min(Dis(pts[nL], pts[nH]), Dis(pts[nH], pts[nL + 1])));
    }
    else
    {
        int nMid = (nL + nH) / 2;
        double fAns = min(Find(nL, nMid), Find(nMid + 1, nH));
        int nK = 0;
        for (int i = nL; i <= nH; ++i)
        {
            if (fabs(pts[i].x - pts[nMid].x) <= fAns)
            {
                ptsTemp[nK++] = pts[i];
            }
        }
        sort(ptsTemp, ptsTemp + nK, CmpY);
        for (int i = 0; i < nK; ++i)
        {
            for (int j = i + 1; j < nK; ++j)
            {
                if (ptsTemp[j].y - ptsTemp[i].y >= fAns)
                {
                    break;
                }
                fAns = min(fAns, Dis(ptsTemp[j], ptsTemp[i]));
            }
        }
        
        return fAns;
    }
}

int main()
{
    int nN;
    
    while (scanf("%d", &nN), nN)
    {
        for (int i = 0; i < nN; ++i)
        {
            scanf("%lf%lf", &pts[i].x, &pts[i].y);
        }
        sort(pts, pts + nN, CmpX);
        printf("%.2f\n", Find(0, nN -1) * 0.5);
    }
    
    return 0;
}


yx 2012-07-18 13:53 鍙戣〃璇勮
]]>
poj 1269 Intersecting Lineshttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/17/183895.htmlyxyxTue, 17 Jul 2012 07:20:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/17/183895.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/183895.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/17/183895.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/183895.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/183895.html閮借繃涓嶄簡(jiǎn)銆傚悗闈㈡敼浜?jiǎn)寰堝鎵崢q囦簡(jiǎn)銆傚厛鍒ゆ柇2鏉$洿綰挎墍鍦ㄧ殑鍚戦噺鏄惁騫寵錛岃繖涓彲浠ュ垽鏂繖2涓悜閲忕殑鍙夌Н鏄惁涓?錛岀劧鍚庡啀鍒ゆ柇綰挎鏄惁閲嶅悎錛?br />鍙互閫?鐐瑰垽鏂弶縐槸鍚︿負(fù)0銆傚鏋滃悜閲忎笉騫寵鐨勮瘽錛岀洿鎺ユ眰浜ょ偣銆傛眰浜ょ偣鐨勫叕寮忔槸鐢ㄤ簡(jiǎn)榛戜功閲岄潰鐨勬柟娉曪紝鍏堟眰鍑?涓弶縐唬琛?涓笁瑙掑艦鐨?br />鏈夊悜闈㈢Н錛岀劧鍚庢牴鎹畾姣斿垎鐐圭殑鍏崇郴錛堥潰縐殑姣斾緥絳変簬浜ょ偣鍒嗗叾涓竴鏉$嚎孌電殑姣斾緥錛夊彲浠ユ帹鍑?guó)櫘〗帡鍏紡銆?br />   鏈夊弶縐拰鐐圭Н榪?涓伐鍏風(fēng)‘瀹炶兘鏂逛究鐨勮В鍐沖緢澶氶棶棰樸?br />
   浠g爜濡備笅錛?br />
#include <stdio.h>
#include <string.h>
#include <math.h>
struct Point
{
    double fX;
    double fY;
};
Point beg[2], end[2];
int nN;
const double fPrecision = 1e-8;

double Det(double fX1, double fY1, double fX2, double fY2)
{
    return fX1 * fY2 - fX2 * fY1;
}

double Cross(Point a, Point b, Point c)
{
    return Det(b.fX - a.fX, b.fY - a.fY, c.fX - a.fX, c.fY - a.fY);
}

int DblCmp(double fD)
{
    if (fabs(fD) < fPrecision)
    {
        return 0;
    }
    else
    {
        return (fD > 0 ? 1 : -1);
    }
}

double DotDet(double fX1, double fY1, double fX2, double fY2)
{
    return fX1 * fX2 + fY1 * fY2;
}

double Dot(Point a, Point b, Point c)
{
    return DotDet(b.fX - a.fX, b.fY - a.fY, c.fX - a.fX, c.fY - a.fY);
}

int BetweenCmp(Point a, Point b, Point c)
{
    return DblCmp(Dot(a, b, c));
}

int SegCross(Point a, Point b, Point c, Point d, Point& p)
{
    double s1, s2, s3, s4;
    int d1, d2, d3, d4;
    d1 = DblCmp(s1 = Cross(a, b, c));
    d2 = DblCmp(s2 = Cross(a, b, d));
    d3 = DblCmp(s3 = Cross(c, d, a));
    d4 = DblCmp(s4 = Cross(c, d, b));
    
    Point e, f;
    e.fX = a.fX - b.fX;
    e.fY = a.fY - b.fY;
    f.fX = c.fX - d.fX;
    f.fY = c.fY - d.fY;
    if (DblCmp(Det(e.fX, e.fY, f.fX, f.fY)) == 0)//2涓悜閲忓叡綰?/span>
    {
        if (d1 * d2 > 0 && d3 * d4 > 0)//涓嶅湪鍚屼竴鏉$洿綰夸笂
        {
            return 0;
        }
        else
        {
            return 2;
        }
    }
    
    //2鏉$洿綰跨浉浜?/span>
    p.fX = (c.fX * s2 - d.fX * s1) / (s2 - s1);
    p.fY = (c.fY * s2 - d.fY * s1) / (s2 - s1);
    return 1;
}

int main()
{
    //freopen("out.txt", "w", stdout);
    while (scanf("%d", &nN) == 1)
    {
        printf("INTERSECTING LINES OUTPUT\n");
        Point p;
        for (int i = 0; i < nN; ++i)
        {
            scanf("%lf%lf%lf%lf", &beg[0].fX, &beg[0].fY, &end[0].fX, &end[0].fY);
            scanf("%lf%lf%lf%lf", &beg[1].fX, &beg[1].fY, &end[1].fX, &end[1].fY);
            int nRet = SegCross(beg[0], end[0], beg[1], end[1], p);
            if (nRet == 0)
            {
                printf("NONE\n");
            }
            else if (nRet == 1)
            {
                printf("POINT %.2f %.2f\n", p.fX, p.fY);
            }
            else
            {
                printf("LINE\n");
            }
        }
        printf("END OF OUTPUT\n");
    }
    
    return 0;
}


yx 2012-07-17 15:20 鍙戣〃璇勮
]]>
poj 2653 Pick-up stickshttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/15/183561.htmlyxyxSun, 15 Jul 2012 09:06:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/15/183561.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/183561.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/15/183561.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/183561.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/183561.html   鍙渶瑕佺┓涓懼垽鏂紝褰撳墠鐨勭嚎孌典細(xì)涓庡摢浜涚嚎孌墊湁浜ょ偣鍗沖彲銆備篃灝辨槸鏆村姏姹傝В錛屼絾鏄嚎孌墊暟鐩甆鏈?0鐨?嬈℃柟錛屽鉤鏂圭畻娉曟槸涓嶈兘榪囩殑銆傝繖涓
鑳借繃鐨勫師鍥犳槸棰樼洰鎻忚堪閲岄潰璇翠簡(jiǎn)錛宼op鐨剆tick涓嶄細(xì)瓚呰繃1000涓傞偅涔堜慨鏀逛笅鏆村姏鐨勬柟寮忛鐩氨鑳借繃浜?jiǎn)銆?br />   浠庡皬鍒板ぇ鏋氫婦姣忎釜媯嶅瓙錛屽垽鏂畠鏄惁涓庡悗闈㈢殑媯嶅瓙鐩鎬氦錛屽鏋滅浉浜ょ洿鎺ユ妸褰撳墠媯嶅瓙鐨則op灞炴х疆涓篺alse錛岀劧鍚巄reak鍐呭眰寰幆銆傝繖鏍峰氨涓?br />浼?xì)瓒呮椂浜?jiǎn)錛屾毚鍔涗篃鏄渶瑕佹妧宸х殑錛岃繖鍙ヨ瘽璇寸殑寰堝鍟娿?br />   鍒ゆ柇2鏉$嚎孌墊槸鍚︾浉浜ょ殑綆楁硶鐩存帴鎸夌収榛戜功涓婄殑妯℃澘浠g爜鍐欎簡(jiǎn)錛岄偅涓ā鏉夸唬鐮佽繕?shù)笉閿欏惂銆傘傘?br />
   浠g爜濡備笅錛?br />   
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX_N (100000 + 10)
struct POS
{
    double fX;
    double fY;
};

POS begs[MAX_N], ends[MAX_N];
bool bAns[MAX_N];
int nN;
const double fPrecision = 1e-8;

double Det(double fX1, double fY1, double fX2, double fY2)
{
    return fX1 * fY2 - fX2 * fY1;
}

//浠浣滀負(fù)鍏叡鐐?璁$畻鍙夌Н
double Cross(POS& a, POS& b, POS& c)
{
    return Det(b.fX - a.fX, b.fY - a.fY, c.fX - a.fX, c.fY - a.fY);
}

int DblCmp(double fD)
{
    if (fabs(fD) < fPrecision)
    {
        return 0;
    }
    else
    {
        return fD > 0 ? 1 : -1;
    }
}
//
bool IsSegCross(int nI, int nJ)
{
    return (DblCmp(Cross(begs[nI], ends[nI], begs[nJ]))
            ^ DblCmp(Cross(begs[nI], ends[nI], ends[nJ]))) == -2
        && (DblCmp(Cross(begs[nJ], ends[nJ], begs[nI]))
            ^ DblCmp(Cross(begs[nJ], ends[nJ], ends[nI]))) == -2;
}

int main()
{
    while (scanf("%d", &nN), nN)
    {
        for (int i = 1; i <= nN; ++i)
        {
            scanf("%lf%lf%lf%lf", &begs[i].fX, &begs[i].fY,
                  &ends[i].fX, &ends[i].fY);
        }
        
        memset(bAns, truesizeof(bAns));
        
        //鏆村姏涔熸槸闇瑕佹妧宸х殑
        for (int i = 1; i < nN; ++i)
        {
            for (int j = i + 1; j <= nN; ++j)
            {
                if (IsSegCross(i, j))
                {
                    bAns[i] = false;
                    break;
                }
            }
        }
        
        printf("Top sticks:");
        bool bPre = false
        for (int i = 1; i <= nN; ++i)
        {
            if (bAns[i])
            {
                if (bPre)
                {
                    printf(",");
                }
                bPre = true;
                printf(" %d", i);
            }
        }
        printf(".\n");
    }
    
    return 0;
}


yx 2012-07-15 17:06 鍙戣〃璇勮
]]>
99久久精品国产一区二区三区 | 亚洲人成网站999久久久综合 | 久久精品国产欧美日韩99热| 久久无码一区二区三区少妇| 日日狠狠久久偷偷色综合96蜜桃| 性做久久久久久免费观看| 日韩人妻无码一区二区三区久久99| 国产精品久久久久蜜芽| 男女久久久国产一区二区三区| 久久综合综合久久综合| 久久中文字幕一区二区| 久久精品国产一区二区三区| 少妇人妻综合久久中文字幕 | 久久夜色精品国产www| 一级做a爰片久久毛片免费陪| 亚洲人成伊人成综合网久久久| 人妻久久久一区二区三区| 青青青青久久精品国产h| 久久午夜福利电影| 伊人久久大香线蕉av不卡| 国产精品99久久精品| 久久精品成人欧美大片| 久久精品成人欧美大片| 99久久久精品免费观看国产| 国产精品99久久久久久www| 国内精品伊人久久久久妇| 99精品久久精品| 亚洲欧美另类日本久久国产真实乱对白| 精品国产99久久久久久麻豆| 久久狠狠色狠狠色综合| 亚洲国产精品综合久久网络| 久久久噜噜噜久久中文福利| 久久精品一区二区影院| 久久精品天天中文字幕人妻| 久久无码精品一区二区三区| 精品久久久无码人妻中文字幕豆芽| 久久WWW免费人成—看片| 久久久久久国产精品免费无码| 久久精品无码一区二区三区免费 | 国产精品久久99| 色播久久人人爽人人爽人人片AV|