锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍙﹀錛屾紨綆楁硶絎旇錛?a >http://www.csie.ntnu.edu.tw/~u91029/ConvexHull.html#a3涓婁篃鏈夋彁鍒拌繖涓畻娉曪紝鎴戜篃鏄粠榪欎笂闈㈢湅鍒扮殑銆?br />榪欎釜綆楁硶鍙互鍋囪鏄疓raham鎺掑簭鍩哄噯鐐瑰湪鏃犻檺榪滃錛屼簬鏄す瑙掑ぇ灝忕殑姣旇緝鍙互鐩存帴鎸夋按騫沖潗鏍囨瘮杈冦?br />
浠g爜濡備笅錛?br />
#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;
}
#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> in, out;
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(in, out);
printf("%d\n", RC(out));
}
return 0;
}
灝ゅ叾鍏充簬榪欎釜姹傛渶榪滅偣瀵圭殑銆?span id="Code_Closed_Text_130220" style="border: 1px solid #808080; background-color: #ffffff; display: none; ">
]]>
鍐嶅鏂扮殑澶氳竟褰㈡眰鍗婂鉤闈氦錛屽鏋滃崐騫抽潰浜ゅ瓨鍦紙鏄釜鐐瑰嵆鍙級(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 <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;
}
]]>
浠g爜鎬濊礬涓昏鏄細(xì)鍏堣鍏ユ墍鏈夌殑澶氳竟褰㈤《鐐癸紝鏀懼叆涓涓獀ector錛坴p錛夐噷闈紝鐒跺悗瀵瑰杈瑰艦鐨勬瘡鏉¤竟姹備竴涓崐騫抽潰銆傚垰寮濮嬬殑鏃跺欙紝鐢ㄤ竴涓?br />vector錛圥olygon錛変繚瀛樹唬琛ㄤ笂涓嬪乏鍙沖洓涓棤闄愯繙瑙掔殑鍥涗釜鐐癸紝琛ㄧず鍘熷鐨勫崐騫抽潰銆傜劧鍚庯紝鐢ㄨ鍏ョ殑澶氳竟褰㈢殑姣忔潯杈瑰幓鍒囧壊鍘熸潵鐨勫崐騫抽潰銆?br />鍒囧壊鐨勮繃紼嬫槸錛屽鏋滃師鏉ワ紙Polygon錛変腑鐨勭偣鍦ㄥ綋鍓嶇洿綰跨殑鎸囧畾涓渚э紝閭d箞鍘熸潵鐨勭偣榪樻槸鏈夋晥鐨勩傚鏋滃師鏉ョ殑鐐瑰拰瀹冪浉閭?cè)潥勪笅涓涓偣涓庡綋鍓?br />鐩寸嚎鐩鎬氦錛岄偅涔堣繕闇瑕佹妸浜ょ偣鍔犲叆Polygon闆嗗悎銆?br /> 榪樻湁姹備氦鐐圭殑鏂規(guī)硶姣旇緝濂囪懇錛岀被浼間簬榛戜功涓婇潰鐨勯偅縐嶆牴鎹潰縐瓑鍒嗙殑鏂規(guī)硶銆?br />
浠g爜濡備笅錛?br />
#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;
}
]]>
浠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 <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;
}
]]>
縐姞璧鋒潵銆?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 <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;
}
]]>
鏃嬭漿鏂瑰悜錛岃繕瑕佹牴鎹綆椾笅涓涓偣鐨勮薄闄愬喅瀹氬亸杞灝戯紝姣忔鍋忚漿鐨勯兘鏄?0搴︾殑鍊嶆暟銆?br /> 璇ョ畻娉曞彲浠ユ柟渚垮垽鏂嚭鐐瑰湪澶氳竟褰㈠唴錛岃繕鏄竟鐣屼笂錛岃繕鏄湪澶氳竟褰㈠闈€?br />
鎽樿嚜鍒漢瀵硅綆楁硶鐨勬弿榪板涓嬶細(xì)
棣栧厛浠庤涔︿腑鎽樻妱涓孌靛姬闀挎硶鐨勪粙緇嶏細(xì)“寮ч暱娉曡姹傚杈瑰艦鏄湁鍚戝杈瑰艦錛屼竴鑸瀹氭部澶氳竟褰㈢殑姝e悜錛岃竟鐨勫乏渚т負(fù)澶氳竟褰㈢殑鍐呬晶鍩熴?br />浠ヨ嫻嬬偣涓哄渾蹇?jī)浣滃崟浣嶅渾锛尀畣鍏ㄩ儴鏈夊?/span>杈瑰悜鍗曚綅鍦嗕綔寰勫悜鎶曞獎(jiǎng)錛屽茍璁$畻鍏朵腑鍗曚綅鍦嗕笂寮ч暱鐨勪唬鏁板拰銆傝嫢浠f暟鍜屼負(fù)0錛屽垯鐐瑰湪澶氳竟褰?/span>澶栭儴錛?br />鑻ヤ唬鏁板拰涓?π鍒欑偣鍦ㄥ杈瑰艦鍐呴儴錛涜嫢浠f暟鍜屼負(fù)π錛屽垯鐐瑰湪澶氳竟褰笂銆?#8221;
鎸変功涓婄殑榪欎釜浠嬬粛錛屽叾瀹炲姬闀挎硶灝辨槸杞娉曘備絾瀹冪殑鏀硅繘鏂規(guī)硶姣旇緝鍘夊錛氬皢鍧愭爣鍘?/span>鐐瑰鉤縐誨埌琚祴鐐筆錛岃繖涓柊鍧愭爣緋誨皢騫抽潰鍒掑垎涓?涓?br />璞¢檺錛屽姣忎釜澶氳竟褰㈤《鐐筆 錛屽彧鑰冭檻鍏舵墍鍦ㄧ殑璞¢檺錛岀劧鍚庢寜閭繪帴欏哄簭璁塊棶澶氳竟褰㈢殑鍚勪釜欏剁偣P錛屽垎鏋怭鍜孭[i+1]錛屾湁涓嬪垪涓夌鎯呭喌錛?/span>
錛?錛塒[i+1]鍦≒鐨勪笅涓璞¢檺銆傛鏃跺姬闀垮拰鍔?#960;/2錛?/span>
錛?錛塒[i+1]鍦≒鐨勪笂涓璞¢檺銆傛鏃跺姬闀垮拰鍑?#960;/2錛?/span>
錛?錛塒[i+1]鍦≒i鐨勭浉瀵硅薄闄愩傞鍏堣綆梖=y[i+1]*x-x[i+1]*y錛堝弶縐級(jí)錛岃嫢f=0錛屽垯鐐瑰湪澶氳竟褰笂錛涜嫢f<0錛屽姬闀垮拰鍑?#960;錛涜嫢f>0錛屽姬闀垮拰鍔?#960;銆?/span>
鏈鍚庡綆楀嚭鐨勪唬鏁板拰鍜屼笂榪扮殑鎯呭喌涓鏍峰垽鏂嵆鍙?/span>
瀹炵幇鐨勬椂鍊欒繕鏈変袱鐐硅娉ㄦ剰錛岀涓涓槸鑻鐨勬煇涓潗鏍囦負(fù)0鏃訛紝涓寰嬪綋姝e彿澶勭悊錛?/span>絎簩鐐規(guī)槸鑻ヨ嫻嬬偣鍜屽杈瑰艦鐨勯《鐐歸噸鍚堟椂瑕佺壒孌婂鐞嗐?br />
浠ヤ笂灝辨槸涔︿笂璁茶В鐨勫唴瀹癸紝鍏跺疄榪樺瓨鍦ㄤ竴涓棶棰樸傞偅灝辨槸褰撳杈瑰艦鐨勬煇鏉¤竟鍦ㄥ潗鏍?/span>杞翠笂鑰屼笖涓や釜欏剁偣鍒嗗埆鍦ㄥ師鐐圭殑涓や晶鏃朵細(xì)鍑洪敊銆?br />濡傝竟(3,0)-(-3,0)錛屾寜浠ヤ笂鐨勫鐞嗭紝璞¢檺鍒嗗埆鏄涓鍜岀浜岋紝榪欐牱浼?xì)鋴射唬鏁板拰鍔?#960;/2錛屾湁鍙兘瀵艱嚧鏈鍚庣粨鏋滄槸琚祴鐐瑰湪澶氳竟褰㈠銆?/span>鑰屽疄闄呬笂
琚祴鐐規(guī)槸鍦ㄥ杈瑰艦涓婏紙璇ヨ竟絀胯繃璇ョ偣錛夈?/span>
瀵逛簬榪欑偣錛屾垜鐨勫鐞嗗姙娉曟槸錛氭瘡嬈$畻P鍜孭[i+1]鏃訛紝灝辮綆楀弶縐拰鐐圭Н錛屽垽鏂鐐規(guī)槸鍚﹀湪璇ヨ竟涓婏紝鏄垯鍒ゆ柇緇撴潫錛屽惁鍒欑戶緇笂榪拌繃紼嬨?br />榪欐牱鐗虹壊浜?jiǎn)鏃堕椷_(dá)紝浣嗕繚璇佷簡(jiǎn)姝g‘鎬?/span>銆?/span>
鍏蜂綋瀹炵幇鐨勬椂鍊欙紝鐢變簬鍙渶鐭ラ亾褰撳墠鐐瑰拰涓婁竴鐐圭殑璞¢檺浣嶇疆錛屾墍浠ラ檮鍔犵┖闂村彧闇O(1)銆傚疄鐜扮殑鏃跺欏彲浠ユ妸涓婅堪鐨?#8220;π/2”鏀規(guī)垚1錛?#8220;π”鏀規(guī)垚2錛?br />榪欐牱渚垮彲浠ュ畬鍏ㄤ嬌鐢ㄦ暣鏁拌繘琛岃綆椼備笉蹇呰冭檻欏剁偣鐨勯『搴忥紝閫嗘椂閽堝拰欏烘椂閽堥兘鍙互澶勭悊錛屽彧鏄渶鍚庣殑浠f暟鍜岀鍙蜂笉鍚?/span>鑰屽凡銆傛暣涓畻娉曠紪鍐?br />璧鋒潵闈炲父瀹規(guī)槗銆?br />
浠g爜濡備笅錛?br />
#include <math.h>
#define MAX (100 + 10)
struct Point
{
double x,y;
};
Point pts[MAX];
const int OUT = 0;
const int IN = 1;
const int EDGE = 2;
const double fPre = 1e-8;
int DblCmp(double fD)
{
if (fabs(fD) < fPre)
{
return 0;
}
else
{
return fD > 0 ? 1 : -1;
}
}
int GetQuadrant(Point p)
{
return DblCmp(p.x) >= 0 ? (DblCmp(p.y) >= 0 ? 0 : 3) :
(DblCmp(p.y) >= 0 ? 1 : 2);
}
double Det(double fX1, double fY1, double fX2, double fY2)
{
return fX1 * fY2 - fX2 * fY1;
}
int PtInPolygon(Point* pts, int nN, Point p)
{
int i, j, k;
for (j = 0; j < nN; ++j)
{
pts[j].x -= p.x;
pts[j].y -= p.y;
}
int nA1, nA2;
int nSum = 0;
nA1 = GetQuadrant(pts[0]);
for (i = 0; i < nN; ++i)
{
k = (i + 1) % nN;
if (DblCmp(pts[k].x) == 0 && DblCmp(pts[k].y) == 0)
{
break;//涓庨《鐐歸噸鍚?/span>
}
int nC = DblCmp(Det(pts[i].x, pts[i].y,
pts[k].x, pts[k].y));
if (!nC && DblCmp(pts[i].x * pts[k].x) <= 0
&& DblCmp(pts[i].y * pts[k].y) <= 0)
{
break;//杈逛笂
}
nA2 = GetQuadrant(pts[k]);
if ((nA1 + 1) % 4 == nA2)
{
nSum += 1;
}
else if ((nA1 + 2) % 4 == nA2)
{
if (nC > 0)
{
nSum += 2;
}
else
{
nSum -= 2;
}
}
else if ((nA1 + 3) % 4 == nA2)
{
nSum -= 1;
}
nA1 = nA2;
}
for (j = 0; j < nN; ++j)
{
pts[j].x += p.x;
pts[j].y += p.y;
}
if (i < nN)
{
return EDGE;
}
else if (nSum)//閫嗘椂閽坣Sum == 4, 欏烘椂閽坣Sum == -4
{
return IN;
}
else
{
return OUT;
}
}
int main()
{
int nN, nM;
int nCase = 1;
while (scanf("%d%d", &nN, &nM), nN)
{
if (nCase > 1)
{
printf("\n");
}
for (int i = 0; i < nN; ++i)
{
scanf("%lf%lf", &pts[i].x, &pts[i].y);
}
printf("Problem %d:\n", nCase++);
for (int i = 0; i < nM; ++i)
{
Point p;
scanf("%lf%lf", &p.x, &p.y);
if (PtInPolygon(pts, nN, p))
{
printf("Within\n");
}
else
{
printf("Outside\n");
}
}
}
return 0;
}
]]>
鐐瑰繀欏繪槸鍦ㄥ杈瑰艦涓婇嗘椂閽堟垨鑰呴『鏃墮拡緇欏嚭鐨勶紝鑰屾眰鍑哄嚫鍖呭垰濂界粰浜?jiǎn)杩欐狅L(fēng)殑涓緋誨垪鐐廣?br /> 鍑稿寘浠g爜錛屽叾瀹炲厛鎵懼嚭涓涓獃鍧愭爣鏈灝忕殑鐐癸紝鍐嶅鍓╀笅鐨勬墍鏈夌偣鎸夋瀬瑙掓帓搴忋傜劧鍚庡鎺掑簭鍚庣殑鐐硅繘琛屼竴涓簩緇村驚鐜嵆鍙備簩緇村驚鐜殑瑙i噴鏄?br />褰撳姞鍏ユ柊鐨勭偣榪涘叆鍑稿寘闆嗗悎鏃跺欙紝濡傛灉涓庝互鍓嶅姞鍏ョ殑鐐瑰艦鎴愮殑鍋忚漿鏂瑰悜涓嶄竴鑷達(dá)紝閭d箞鍓嶉潰閭d簺鐐歸兘闇瑕佸脊鍑洪泦鍚堛?br />
浠g爜濡備笅錛?br />
#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 /> //濡傛灉涓嶆槸閫嗘椂閽堝亸杞紝鍒欏脊鍑鴻鐐?/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;
}
]]>
浜?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 />
#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 <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;
}
]]>
浠g爜濡備笅錛?br />
#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;
}
]]>
鑳借繃鐨勫師鍥犳槸棰樼洰鎻忚堪閲岄潰璇翠簡(jiǎn)錛宼op鐨剆tick涓嶄細(xì)瓚呰繃1000涓傞偅涔堜慨鏀逛笅鏆村姏鐨勬柟寮忛鐩氨鑳借繃浜?jiǎn)銆?br /> 浠庡皬鍒板ぇ鏋氫婦姣忎釜媯嶅瓙錛屽垽鏂畠鏄惁涓庡悗闈㈢殑媯嶅瓙鐩鎬氦錛屽鏋滅浉浜ょ洿鎺ユ妸褰撳墠媯嶅瓙鐨則op灞炴х疆涓篺alse錛岀劧鍚巄reak鍐呭眰寰幆銆傝繖鏍峰氨涓?br />浼?xì)瓒呮椂浜?jiǎn)錛屾毚鍔涗篃鏄渶瑕佹妧宸х殑錛岃繖鍙ヨ瘽璇寸殑寰堝鍟娿?br /> 鍒ゆ柇2鏉$嚎孌墊槸鍚︾浉浜ょ殑綆楁硶鐩存帴鎸夌収榛戜功涓婄殑妯℃澘浠g爜鍐欎簡(jiǎn)錛岄偅涓ā鏉夸唬鐮佽繕涓嶉敊鍚с傘傘?br />
浠g爜濡備笅錛?br />
#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, true, sizeof(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;
}
]]>