題意 : 給定n個點,求兩個點間最小距離;n <= 10000;
n ^ 2 是肯定過不了的,考慮分治;這個部落格講的很清晰。1、將集合一分為二,求左半邊最小距離,右半邊最小距離,返回兩者較小值;
2、以較小值為半徑,以中心點為圓心畫圓,尋找左右兩邊在圓內的點,暴力求距離然後更新答案。
很巧妙,很經典;
#include#include#include#include#includeusing namespace std;
const int maxn = 10000 + 5;
int n;
struct hh a[maxn];
double calc(hh a,hh b)
bool cmp(hh a,hh b)
double d(int l,int r)
ans = min(d(l , mid),d(mid + 1 , r));
int l0 = mid - 1, r0 = mid + 1;
while(a[l0].x - a[mid].x < ans && l0 >= l) l0 --;
while(a[r0].x - a[mid].x < ans && r0 <= r) r0 ++;
for(int i = l0 + 1;i <= r0 - 1 ;i ++)
for(int j = i + 1;j <= r0 - 1;j ++)
ans = min(ans ,calc(a[i] ,a[j]));
return ans;
}void solve()
int main()
先考慮直線分割,發現f(n) = f(n - 1) + n,再考慮將直線變成折線。
直線變成折線時,如圖;
因此 f(n) = f(2 * n) - 2 * n;
然後化簡為 n * n * 2 - (n - 1)
平面分割問題
#include#include#include#includeusing namespace std;
int n,t;
int main()
}
錯排:n個人寫了n封信送給其他人,問有多少種贈送方案(即每個人不能把信給自己)
錯排公式為 f(n) = (n - 1)[f(n - 1) + f(n - 2)]
f(1) = 0, f(2) = 1;
第k個人贈送方案為(n - 1)種,假設他給了第m個人;
分兩種情況:
1、第m個人把信給了第k個,則此時方案數為f(n - 2);
2、第m個人沒有把信給第k個人,則相當於m是k(m不能給k,k不能給k,兩者等價),則此時方案數為f(n - 1);
#include#include#include#includeusing namespace std;
long long a[25];
long long t,n,m;
long long c(long long x,long long y)
void solve()
}int main()
漢諾塔
遞推公式為 f(n) = 2 ^ n - 1;
#include#include#include#include#includeusing namespace std;
typedef long long ll;
ll n,k,t;
int main()
}
函式模組和類模組oj題(D)
組合語言 函式模板用來幹嘛?就是為了解決乙個函式可以對不同型別的引數進行處理 函式業務邏輯一樣,但是函式引數型別不一樣,也就是乙個通用函式。函式模組 如 1.定義乙個函式模板,能完成兩個相同型別資料比較。比較結果分別是 1,0,1。當第乙個資料小於第二個資料時,返回 1。當第乙個資料等於第二個資料時...
函式模組 POPUP TO DECIDE
函式模組 popup to decide list 這個函式模組可以彈出乙個視窗,根據使用者傳入顯示若干個單 多選按鈕,並將使用者選擇返回。popup to decide list dialog box for choosing from a list without diagnosis 輸入引數如...
8 函式 模組
def functionname parameters 函式 文件字串 function suite return expression python 函式的引數傳遞 引數 匿名函式 python 使用 lambda 來建立匿名函式。全域性變數和區域性變數 定義在函式內部的變數擁有乙個區域性作用域,...