aoj2201(極限情況)

2021-07-27 11:57:24 字數 2370 閱讀 5011

/*

translation:

有n個寶石,寶石為圓形。給出現在有根金屬棒,靠近寶石距離m之內就會吸附上去。現在給出每顆寶石的資訊,求用這個棒子一次

能釣出最多多少個寶石?

solution:

極限情況

每個寶石可以看成兩個圓(本來的圓+半徑加上m的圓)。對這些圓形一一枚舉,即可求出各自的公切線(即金屬棒)。然後

求出此時能吸附多少寶石。逐一更新即可。

note:

# 為何最後計算吸附多少寶石時用lamda表示式就能過,自己寫的函式就過不了?qaq

*/#include #include #include #include #include using namespace std;

const int maxn = 100 + 5;

const double pi = acos(-1);

struct point

point(double x_, double y_):x(x_),y(y_){}

};typedef point vector;

int n;

struct circle:public point

circle(point c, double r, double m):c(c.x, c.y),r(r),m(m){}

point getpoint(double a)

};vectorp;

vector operator + (vector a, vector b)

vector operator - (point a, point b)

vector operator * (vector a, double p)

vector operator / (vector a, double p)

bool operator < (const point& a, const point& b)

const double eps = 1e-12;

int dcmp(double x)

bool operator == (const point& a, const point& b)

double dot(vector a, vector b)

double length(vector a)

double angle(vector a, vector b)

double angle(vector v)

double cross(vector a, vector b)

double dist(point p1,point p2)

double disttoline(point p, point a, point b)

int gettangents(circle a, circle b, vector& a, vector& b)

int d2 = (a.c.x - b.c.x)*(a.c.x - b.c.x) + (a.c.y - b.c.y)*(a.c.y - b.c.y);

int rdiff = a.r - b.r;

int rsum = a.r + b.r;

if(d2 < rdiff * rdiff) return 0;

double base = atan2(b.c.y - a.c.y, b.c.x - a.c.x);

if(d2 == 0 && a.r == b.r) return -1;

if(d2 == rdiff * rdiff)

//有共切線

double ang = acos((a.r - b.r) / sqrt(d2));

a.push_back(a.getpoint(base + ang)); b.push_back(b.getpoint(base + ang));

a.push_back(a.getpoint(base - ang)); b.push_back(b.getpoint(base - ang));

if(d2 == rsum * rsum) else if(d2 > rsum * rsum)

return a.size();

}int cmp(double a, double b)

int main()

vectora, b;

for(int i = 0; i < n; i++)

} int num = a.size(), ans = 1;

for(int i = 0; i < num; i++) );

ans = max(ans, res);

} printf("%d\n", ans);

}return 0;

}

AOJ 綜合訓練 2016 11 24

題意分析 分別讀入10個數,按照他給出的格式輸出就行了。注意每有7個字元 包括空格 include int main 題意分析 給出n個數,公升序排序,然後輸出最大的2個就行了。注意氣泡排序寫法。外層迴圈n 1次,記憶體迴圈n i 1次。include define max 10001 int a ...

AOJ 綜合訓練 2016 12 1

題意分析 根據公式,先用含有n的代數式表示出來pi,然後計算這個近似值和題目給出來的3.14159165作差求絕對值,當差值大於1e 5的時候繼續計算,否則就跳出迴圈輸出。有幾點需要注意的,首先做除法預算的時候 題目中的n 要為double型別,如果為int型別的話最後結果為0。還有注意題目中的初始...

插入排序(aoj)

像打撲克牌那樣 對於未排序資料 右手抓到的牌 在已經排序序列 左手已經排好序的手牌 中從後向前掃瞄,找到相應的位置並插入。演算法描述 1.從第乙個元素開始,該元素可以認為已經被排序 2.取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 3.如果該元素 已排序 大於新元素,將該元素移到下一位置 4....