演算法競賽入門經典 高效演算法 巨人與鬼

2021-08-18 06:00:25 字數 1477 閱讀 1736

巨人與鬼:

題目:2

0 0 1 2

2 1 -1 4

樣例輸出(有可能有多種匹配方案,只要符合要求即可):

0--2

1--3

這一題書上說是分治+遞迴,但是筆者剛開始只是當成數理題做,並沒有意識到其分治的思想,下面的**也是按照筆者最開始的數理方法寫的,分治思想的**之後再補上。

1 .首先,要如何想到這種極座標的結構呢?事實上,可以這麼想:對於乙個巨人a,比如下圖遠點位置的藍圓圈,總要有乙個鬼和它配對(題中說n個鬼,n個巨人),因此,現在我們要在n個鬼當中選1個鬼給巨人a懟,這樣就很自然地想到以該巨人a為原點,鬼們繞著這個巨人,這樣再來考慮如何選鬼被巨人a懟會直觀一些,考慮到題目中說,

因此我們還要考慮其它巨人的空間位置。

#include#include#includeusing namespace std;

#define maxsize 1005

#define inf 10000000

/*input example:

20 0 1 2

2 1 -1 4

30 0 2 2 1 3

3 0 -1 4 -2 1

*/struct monster

a[maxsize], angle[maxsize];

int visit[maxsize];

bool cmp(monster a, monster b)

else

else

return x2*y1 < y2*x1; }}

void sortbyangle(int centerind,int n)

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

sort(angle, angle + k, cmp); }

int main()

//input ghosts' position

for (i = n;i < 2*n;i++)

/* check whether the input is correct.

for (i = 0;i < 2 * n;i++)

cout << a[i].ind << " " << a[i].x << " " << a[i].y << endl;

*/ int s = 2*n;

int fstmgst = 0;

while(s)

}//sort a and then asign to angle.

sortbyangle(centerind, 2 * n);

for (i = 0;i < s;i++)

if(visit[angle[i].ind]==0)

{if (angle[i].cat == 0 && fstmgst == 0)

{//match centerind and angle[i].ind

cout << centerind << "--" << angle[i].ind《如有錯誤,希望各位踴躍指出。

演算法競賽入門經典 1

想著要學演算法已經很長時間了,但一直都是有問題自己想,很少受 正規軍 編排,網上關於演算法的書倒是不少,其一必推 演算法導論 還有一本 演算法競賽入門經典 作者劉汝佳,好了,步入正題,兩天時間從第一章到第三章結尾,算是對c又進行了一遍複習,說一下新得 3d 3d 03d 知道它們的區別嗎,在呼叫pr...

演算法競賽入門經典 WERTYU

題目描述 把手放在鍵盤上時,稍不注意就會往右錯一 位。這樣,輸入q會變成輸入w,輸入j會變成輸 入k等。鍵盤如圖3 2所示。輸入乙個錯位後敲出的字串 所有字母均 大寫 輸出打字員本來想打出的句子。輸入保 證合法,即一定是錯位之後的字串。例如輸入中不會出現大寫字母a。樣例輸入 o s,gomr ypf...

演算法競賽入門經典例題

7744問題 問題 輸出所有形如aabb的四位完全平方數 即前兩位數字相等,後兩位數字也相等 include include int main 開燈問題 include include define maxn 1010 int a maxn int main int n,k,first 1 mems...