Skip to content

Commit 6470d5b

Browse files
committed
Merge remote-tracking branch 'origin/drafts'
2 parents e9b05dc + 16c1eb7 commit 6470d5b

File tree

3 files changed

+129
-0
lines changed

3 files changed

+129
-0
lines changed

src/algorithm/砍树.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# 砍树
2+
3+
现在有 $n$ 颗树,$a_i$ 表示树的初始高度,$b_i$ 表示树的每天生长速度,砍一棵树的代价是树的总高度
4+
5+
## 1. 每天砍一棵,总代价最小
6+
7+
应当每天砍一棵生长速度最快的
8+
9+
## 2. 不砍树,问前 $n$ 天最高的树的高度分别是多少
10+
11+
```
12+
生 1 3 5 7
13+
初 4 3 2 1
14+
```
15+
16+
先按生长速度排序,再维护一个单调队列,保证队列中每棵树超过前一棵树的日期递增
17+
18+
首先,显然队列中的初始高度递减,否则下面的第一棵树总是不会超过第二棵树
19+
20+
```
21+
生 1 3
22+
初 4 5
23+
```
24+
25+
计算超过的时间 $a_{i+1} + tb_{i+1} = a_i + t b_i \to t = \frac {a_{i+1} - a_i} {b_i - b_{i+1}}$
26+
27+
可知队列中的 $t$ 总应该是正的
28+
29+
## 3. 每天可以免费锯一棵树。必须先砍后锯
30+
31+
32+
33+
## 4. 奇数天可以免费锯一棵树。必须先砍后锯

src/math/拉格朗日乘数法.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,44 @@ $$
108108

109109
于是得到拉格朗日乘数法的新约束
110110

111+
## 一个例题
112+
113+
求 $|z|$ 在
114+
$$
115+
\begin{cases}
116+
x^2+9y^2 - z^2 = 0\\
117+
x + 3y + 2z = 5
118+
\end{cases}
119+
$$
120+
121+
约束下的最大值和最小值
122+
123+
---
124+
125+
此题有两个优化
126+
127+
- $|z|$ 与 $z^2$ 的最值在同一点取到,可以去掉绝对值
128+
- 不必将 $z$ 看作 $z(x, y)$ 的函数,而是取 $f(x, y, z) = z^2$ 视为三元函数
129+
130+
两个约束条件写为
131+
132+
$$
133+
\begin{cases}
134+
F(x, y, z) = 0\\
135+
G(x, y, z) = 0
136+
\end{cases}
137+
$$
138+
139+
于是可以取拉格朗日函数:
140+
141+
$$
142+
L(x, y, z, \lambda_1, \lambda_2) = f - \lambda_1 F - \lambda_2 G
143+
$$
144+
145+
##
146+
147+
拉格朗日函数 $L = f - \sum \lambda_i g$ 能不能写作 $L = f + \sum \lambda_i g$
148+
149+
---
150+
151+
可以,因为不改变切空间

src/math/矩阵乘法.ipynb

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,61 @@
7171
"source": [
7272
"a * b"
7373
]
74+
},
75+
{
76+
"cell_type": "code",
77+
"execution_count": 2,
78+
"metadata": {},
79+
"outputs": [
80+
{
81+
"ename": "KeyError",
82+
"evalue": "'push1'",
83+
"output_type": "error",
84+
"traceback": [
85+
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
86+
"\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
87+
"Cell \u001b[1;32mIn[2], line 9\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m op \u001b[38;5;129;01min\u001b[39;00m ops:\n\u001b[0;32m 8\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m op\u001b[38;5;241m.\u001b[39mstartswith(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpush\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m----> 9\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[43mnow\u001b[49m\u001b[43m[\u001b[49m\u001b[43mop\u001b[49m\u001b[43m]\u001b[49m \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 10\u001b[0m now[op] \u001b[38;5;241m=\u001b[39m {}\n\u001b[0;32m 11\u001b[0m prev\u001b[38;5;241m.\u001b[39mpush(now)\n",
88+
"\u001b[1;31mKeyError\u001b[0m: 'push1'"
89+
]
90+
}
91+
],
92+
"source": [
93+
"ops = [\"push1\", \"push2\", \"pop\"]\n",
94+
"\n",
95+
"prev = []\n",
96+
"root = {}\n",
97+
"now = root\n",
98+
"\n",
99+
"for op in ops:\n",
100+
" if op.startswith(\"push\"):\n",
101+
" if op not in now:\n",
102+
" now[op] = {}\n",
103+
" prev.push(now)\n",
104+
" now = now[op]\n",
105+
" else:\n",
106+
" now = prev.back()\n",
107+
" prev.pop()\n",
108+
"\n",
109+
"total = 0\n",
110+
"\n",
111+
"def cnt(now):\n",
112+
" total += 1\n",
113+
" \n",
114+
" if now is None:\n",
115+
" return\n",
116+
" for child in now:\n",
117+
" cnt(child)\n",
118+
"\n",
119+
"cnt(root)\n",
120+
"print(total)\n"
121+
]
122+
},
123+
{
124+
"cell_type": "code",
125+
"execution_count": null,
126+
"metadata": {},
127+
"outputs": [],
128+
"source": []
74129
}
75130
],
76131
"metadata": {

0 commit comments

Comments
 (0)