-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
303 lines (143 loc) · 285 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>数据结构实验四</title>
<link href="/posts/9465.html"/>
<url>/posts/9465.html</url>
<content type="html"><![CDATA[<h1><span id="shi-yan-si-di-yi-ti">实验四第一题</span><a href="#shi-yan-si-di-yi-ti" class="header-anchor">#</a></h1><pre class="line-numbers language-xml"><code class="language-xml">#include <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>iostream</span><span class="token punctuation">></span></span>using namespace std;#define MAX 20000int N, a, b;struct myqueue{ int data[MAX]; int head, rear; void init() { head = 0; rear = 0; } int size() { return (MAX - head + rear) % MAX; } bool empty() { if (size() == 0) return true; else return false; } bool pop(int& e) { if (size() == 0) return false; e = data[head]; head = (head + 1) % MAX; return true; } bool push(int e) { if ((rear + 1) % MAX == head) return false; data[rear] = e; rear = (rear + 1) % MAX; return true; } int front() { return data[head]; } int back() { return data[rear]; }}Q;int main(){ int x,temp; for (int i = 0; i < 5; i++) { cin >> x; Q.push(x); } for (int i = 0; i < 5; i++) { cout << Q.front()<<" "; temp = Q.front(); Q.pop(temp); }}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>]]></content>
</entry>
<entry>
<title>数据结构实验三</title>
<link href="/posts/1.html"/>
<url>/posts/1.html</url>
<content type="html"><![CDATA[<h1><span id="ti-mu-yi">题目一</span><a href="#ti-mu-yi" class="header-anchor">#</a></h1><blockquote><p><strong>实验内容</strong></p><p>1、从键盘输入一整数的序列a1,a2,…an,编写算法实现:用顺序栈结构存储输入的整数序列,当ai不等于-1时,将ai入栈;当ai=-1时,输出栈顶整数并出栈。要求能应对入栈满等异常情况,并给出提示信息。</p></blockquote><h2><span id="da-an">答案</span><a href="#da-an" class="header-anchor">#</a></h2><pre class="line-numbers language-xml"><code class="language-xml">#include<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>iostream</span><span class="token punctuation">></span></span>using namespace std;#define n 5int sum = 0;int N, M;struct stack{ int a[n]; int t = -1; void push(int element) { a[++t] = element; } void pop() { --t; } int top() { return a[t]; } bool empty() { return t == -1 ? 1 : 0; } int size() { if (t == -1) return 0; return t + 1; }}Q;int main(){ for (int i = 0; i < 30; i++) { int x; cin >> x; if (x == -1) { if (Q.size() == 0) { cout << "栈为空,无法出栈" << endl; } else { int temp; temp = Q.top(); cout << temp; Q.pop(); } } else if (Q.size() == n - 1) { cout << "栈满" << endl; } if (x != -1) Q.push(x); } return 0;}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1><span id="ti-mu-san">题目三</span><a href="#ti-mu-san" class="header-anchor">#</a></h1><blockquote><p>迷宫</p></blockquote><h2><span id="da-an">答案</span><a href="#da-an" class="header-anchor">#</a></h2><pre class="line-numbers language-xml"><code class="language-xml">#include <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>stdio.h</span><span class="token punctuation">></span></span>#include <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>stdlib.h</span><span class="token punctuation">></span></span>#define m 6 /* 迷宫的实际行数 */#define n 8 /* 迷宫的实际列数 */#define STACK_INIT_SIZE 100typedef struct{ int x, y, d; /* 横纵坐标及方向 */} SElemType;typedef struct{ SElemType stack[STACK_INIT_SIZE]; int top;} SeqStack;typedef struct{ int x, y;} Item;SElemType XX = { -1, -1, -1 };int maze[m + 2][n + 2] ={ {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 1, 1, 1, 0, 1, 1, 1, 1}, {1, 1, 0, 1, 0, 1, 1, 1, 1, 1}, {1, 0, 1, 0, 0, 0, 0, 0, 1, 1}, {1, 0, 1, 1, 1, 0, 1, 1, 1, 1}, {1, 1, 0, 0, 1, 1, 0, 0, 0, 1}, {1, 0, 1, 1, 0, 0, 1, 1, 0, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}};Item move[8] = { {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}, {-1, 0}, {-1, 1} };void Init_SeqStack(SeqStack* S);int Empty_SeqStack(SeqStack* S);int Push_SeqStack(SeqStack* S, SElemType x);SElemType Gettop_SeqStack(SeqStack* S);SElemType Pop_SeqStack(SeqStack* S);int OnePath(int maze[m + 2][n + 2], Item move[8], SeqStack* S);int main(){ SElemType temp; SeqStack* S; S = (SeqStack*)malloc(sizeof(SeqStack)); if (!S) { printf("空间分配失败!"); exit(0); } Init_SeqStack(S); OnePath(maze, move, S); if (S->top == -1) { printf("此迷宫无路径\n"); } else { printf("迷宫路径为:\n"); while (!Empty_SeqStack(S)) { temp = Pop_SeqStack(S); printf("(%d,%d)-", temp.x, temp.y); } while (getchar() != '0') { printf("请输入0,退出程序!"); } } return 0;}void Init_SeqStack(SeqStack* S){ S->top = -1;}int Empty_SeqStack(SeqStack* S){ return S->top == -1;}int Push_SeqStack(SeqStack* S, SElemType x){ if (S->top == STACK_INIT_SIZE - 1) { printf("栈已满,无法入栈\n"); return 0; } else { S->top++; S->stack[S->top] = x; return 1; }}SElemType Gettop_SeqStack(SeqStack* S){ if (Empty_SeqStack(S)) { return XX; } else { return S->stack[S->top]; }}SElemType Pop_SeqStack(SeqStack* S){ if (Empty_SeqStack(S)) { printf("\n栈为空!"); exit(0); } else { S->top--; return S->stack[S->top + 1]; }}int OnePath(int maze[m + 2][n + 2], Item move[8], SeqStack* S){ int x, y, d, i, j, dd; SElemType temp; temp.x = 1; temp.y = 1; temp.d = -1; Push_SeqStack(S, temp); maze[temp.x][temp.y] = -1; dd = 0; while (!Empty_SeqStack(S)) { temp = Gettop_SeqStack(S); x = temp.x; y = temp.y; d = dd; while (d < 8) { i = x + move[d].x; j = y + move[d].y; if (maze[i][j] == 0) { temp.x = i; temp.y = j; temp.d = d; Push_SeqStack(S, temp); dd = 0; maze[i][j] = -1; if (i == m && j == n) return 0; break; } else d = d + 1; } if (d == 8) { temp = Pop_SeqStack(S); dd = temp.d + 1; } } return 0;}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>]]></content>
</entry>
<entry>
<title>上架视频</title>
<link href="/posts/38391.html"/>
<url>/posts/38391.html</url>
<content type="html"><![CDATA[<blockquote><p><strong>说明:本系列教学视频用于测试,请机构根据你们自己的需求具体情况具体分析进行金额的设置</strong></p></blockquote><h1><span id="ke-cheng-shang-jia-shi-pin">课程上架视频</span><a href="#ke-cheng-shang-jia-shi-pin" class="header-anchor">#</a></h1><p><video controls preload="auto" width="100%" poster data-setup="{"aspectRatio":"16:9"}"><source src="https://pan.axianyu.cn/f/GkxS2/shangjia.mp4" type="video/mp4"><object data="1" width="100%"><embed src="1" width="100%"><p class="vjs-no-js">如果你无法看到该视频,那么可能你的电脑不支持该文件格式。</p></object></video></p><h1><span id="ke-cheng-xiao-ke-shi-pin">课程消课视频</span><a href="#ke-cheng-xiao-ke-shi-pin" class="header-anchor">#</a></h1><p><video controls preload="auto" width="100%" poster data-setup="{"aspectRatio":"16:9"}"><source src="https://pan.axianyu.cn/f/YPLSg/%E6%B6%88%E8%AF%BE%E8%A7%86%E9%A2%91.mp4" type="video/mp4"><object data="1" width="100%"><embed src="1" width="100%"><p class="vjs-no-js">如果你无法看到该视频,那么可能你的电脑不支持该文件格式。</p></object></video></p><h1><span id="ke-cheng-shang-jia-xia-jia-pdf-wen-dang">课程上架/下架PDF文档</span><a href="#ke-cheng-shang-jia-xia-jia-pdf-wen-dang" class="header-anchor">#</a></h1><p><a href="https://pan.axianyu.cn/f/AoYux/%E7%8F%AD%E8%AF%BE%E5%88%9B%E5%BB%BA%E4%B8%8A%E4%B8%8B%E6%9E%B6%E8%B0%83%E7%8F%AD%E8%B0%83%E8%AF%BE%E6%93%8D%E4%BD%9C%E6%89%8B%E5%86%8C.pdf">课程上架/下架PDF文档</a></p>]]></content>
</entry>
<entry>
<title>Shell学习笔记</title>
<link href="/posts/59949.html"/>
<url>/posts/59949.html</url>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="错了错了,再猜猜看" data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="4037535d8cf3435ae91d65807698e7cb89d4b16c57eaa7f32ff1d882a5a7494b">b73bd50429e4d350727cbeb8853cc6e0767e9e5da1659ca87b36b60e5c434f39c139711dbe35d334589b17ce37b83041769134d336f506c8b895089f8aa78d434617189bceaa2f4519f17de8ff2fc44d00c971221728172cc07dc29ed44d4914268fca6e0b13f3167a061636058e21608664db5035db6c774b7cd681a615bcc258f496ea344a806c980e85227168045b7de782be2ebac86654bdad64b8b3ae6943f4fb0757d5132cecb6b1cb31a764c3acc9e2ac0134f966b66e52940122e2abca5e34238426272ea57ef2d0a710e5bbe6491c992f45e9097a4286827ef52b1db1d8c03283312e4bd4c434168f357ac4daa30f6dcb889fed007f1ef611261ddf0dd726e2e2de55fdc310b69267b226293984033fdfd4b03bbd7358d92d4b1a58f16a4ac6bcbc1fe3498357b00fa4879335739e2dc51eb9d69d5c7b8f0c356978528b92c5f88597b4680a964e4baf69441be07e5ca384a16c6462040c591e318e48a09ae7f2954d21e3c651f5e0dac53e116c98d7bfb49c8e6a510748fefcbbf90f80588d671db1a3eb41e25c35e5bd63c292625b7544338eac106934d697863addfa58de37ce97eee99855117178d15d540ea75a1f4f4b0484e0fa26d554952706d2ff31964e9df72bcf0467cf3365df1b980fcfca1a26ea057e4fdf321b4db913c8edfebc9a46d0c1fe1b88a0d881e2a6de256e45de09e5fea87aa8b8e840c19d1de1f7feeed32f3595116fe54830cf40dcfb81ce21b972b7f39a4440347d51cb62e98a59ea36c4b493012ea34c2a04edf323104faffa19e4a41cd1993cbd9378bdc65db8218c41ca48676cd79b23cd96730b524ef62bf9ea15b0331cb1ed8db1360b34b57eb7a6d10ac7187a0e521aafc82fa726d1c9f6b764d32438f574e0992c8b92060b2d721d6f1effcf87b450baffddf51bc359687070f96865066a2e1c7e544cce5ec004b987f72f2a5a4ddaa0bb2ffaae891aa9de4805cfc4a7c2550b3e2356dddaa5cc1b3de865c32ae2243845d8c4c47c2c9efc5a695d7b34603b4deb71dd2743ef6d8e5da099dadaf09c12b16a751e5b84fc0760831c11d87aff660ea5e37a08b446b720e385471db4caba63bc63610f0d58d298e6473e35a49c28b262f4b336b773e2b2965f2de94821f22d322c7f542400ced970663472f8ce135f89c4540dead2535263ddd441b6e6b7086037300f12e8d83c368aa5609df064c611119adc078934d0eb12e346a8ce31751b86b0631ed8bf72d4caab0c9685d2a740e9d80ba3fb9aa9415d5dc41bce56f6b4f201fe90138a76743b0c2eb0bef092626aa6776c267da83051cb0e308a9cd83d455021274e4d3de9e6a97124150492c091e417c5e5396105930d97e5c169f0a7b5a4f2abebd12722f1275c68e527263193f54511d2fb2ce67c339b1636778278e4e515947a13f41c4e6c255b07a7d27f64a7b062357538c96808dd5c28b7432663dee8b5125ac829567b0239e793d0fc5ef7ce451bdc4a97701595e463a284cdccf03586aedcba6cb28731291de110d75adb0b601b25ad8cd33a2c0fc6f2882d6db6588778d098710808f23940131ad701e764c43e949c85c41071d95789a93c7212cd2c62d452d190f2eacb110e4876f6e6a509a4bba9172b3b5ad987e22abc7aed708deaff87687cb117f186df2b7632067344f7ee25ae7507e24f5cdcaf8b72edc2bd6d6a17d4d1ed2db776c6af3775f46ea5c0cde91a608a65a396f08a7a3f767f0105913901ee8457f58c38586a4065c3829d2083c09a293608fa6214c0f7dae93990fd0e790b729dc4daf417d4ca5fbf1b40757db3c9f71f4f167cd2022030f1d617f7861ac42e77ea18aa5bf6da3da32d3431de124ac3139e1a092e4d8ce70bf4f358931cd9d88c36a34bdc4653d3febdee7ba95dab7a53497762f3e712901104e1b4de89f08acbfde9c875c37b64d7b3f9760f0b8ba12ad561f3e4d18b4601f5c96ddb7e74ff7d508a5b90a025d9e10c51c6e2ba6288bcc630dd2fa92aa48fb546edc559b2834049f0b6b5f15c89403f050bef00c7c559b2c33f18417c4a796aab1181a87d073b30c69eb9a136c9a3558848a906ee73a703efde7b606c1c853a0ead59ed80aa84d6a293390e824a6ead57700fe04ddfab9807f1cd54598d997a12f9710ae9f072812d3fe191ab5ef92209d20682d2f1e2d7a66c77619ad6a581b8a73ffd910085508f6dcbfc8934a4dd825a5d4062b1bc84394dfa37d81fb068375b7a4ddc50d1190b339b02bcf829cfad4290cfa32b772b0debf3333a2fbc34daa76f8c970f7d27569661199eb9d4ca1481f89b9e60e20afc48187ce757fdbea2dc0faee0f8bb610381ea764eb221ce65857ef913dffc2188d7b31ac39185cec1cfd0e528b3a0ecfaa9ecae3de117554528a58d9de8dcf60ea0f2de101d342a1b011b25f24919d8a5ee9c6f35ab85e69f729d584fb0dc5b3af8791cdf7f7f19c1647556dcbc0412aed9356e613e092a2eafcd503ab04c8a348c648b811e38340b91e8f4cc5692bc98a10a3538b66a86d37985ca7c4f44c53ccbe6c567d655b7cca04c867510d6a995a5f540163b8bfba897a70fa5d89e6b183d0adc5724ed3e17d09c6631e47cad4101cccc6a7cad5c0a80fa7b0871e89a0a6001c80a5ec62c8af95a1462a8c15cc1ed0f82462d72ab6303b4f7e0ce12f6b1c6f0d1c8286508d0344ee68a83b161b190e74d280ab81bf390d2246ecb8139be0788576939f3d1c2637e38c68f68dee91fbdd022355851603612ae55b6bce0376a2cac5346531bec50dc453e9c2ac7a7ad7018db62553d502f4a1e04af1d4cce00efa84802eb9ef11a9b4281098bd04694de672d92434a7490792c509eeaa25c2186b7ad1ed8ea15cb160882b0eaf69be0e7b09c2b5c4585cb992c33cca98a3e0afe5a2ae2604bdf52c0583ca550c207282d81892344d4feca97e1006ae622fd2c34a0aad593b2d9cb86863c5c4d8e8a3b3d600154acd2b067887bd11b157e39e3de156ca6a51f1a1047f6d1100486ace49cb51ba627450840867506237780a4557484a748a72831df26414429ba17e6e648052a536a331f3fa0e03deda4203434071d10330446ef1c55e8bbeff5b69f873e122e536e46c183b33a478415d591a9cb9ad75df1142d2091000215b216aeecb45ff9d8cb3b25d42b47c77917c6851f3402bc3afd587ba6ec14639b86e766895ef77a167019bdbc5a776f4a39e9f65578533790fadd0a9d0a151c382b21c583ab69bbc69aec5d7497f80554b47cb138e123be0011038e6c73cc233dad3c2df032fceca3cbc5993b7c0c8d1981b5b669e2f124065bbde7e58a6ba00aeba9d0ecefb2c22b4ac3370ff6feb21b5d43c6378a4159d2c25689cf64c224f2eb2780a034e6b2d170ef7be353081a4bf28b46c82479798cf49946d1ebec9b9c0ea354bdfb6546d69305ed8d91383477f4081be0c4cb65d7a917998648a69edba16f3c9068ff65da30f978e878ac45c1b82c1ae2c6c0bcb040f240c2d921dd29a584402c625d01a9b195eda2561d85eed9f8a2d5bc6e0e8411e912095fa67c889d1be283d5a69a47d835e874a4967fd56cf681498108fb964b63ed55b02501fab0c8c6276c8a2109bd2c77ed1f5f57cb2a355bfa066871c93527de98ba505323694bb78ff469d4fa75bcb8b0be6b9d737958de4cbd26edb2e61f8667ae6f3d2b64ace84fad2542d7040aa246631c06b31adb48a9097ecb1f5186d7cc4dbc7951d88b0bbbc8ddb4bdd256d1d78fba1a4ed0a05899482066675ed5a49edad6d96776b94323dbec2855d33faaff2ad0204398219740a3b0d8e2c5968e300b641dd9f868eeda540c4c2b5acd1908286fe21a549359e9922ddf7a7e18242c304d17d80824c247834019fac44facc3ec612f68a7750566678c7350bf804739da086b6b7328301be7bd4cf400648379f508b048f7d17a4a690837de998e48e23e47f23960ef918da28d618c9cd9c45120be753a7084b624029921cba93d55abe0472333add7ba53518e17e38ad1d109d1ae05788101bb21df063cd6b62fda137f79c8482589f7aa944d0733d4d845c43ddf115ccfc12d412cfa58eba11b8b820da03c14bf311b85f4cd34b3fcffa40167c3f6fd43ec3b81e931fb8292ed0fd3ae256ca7d27e5a6a252e02df7be38d46df22335aebeb7ea4f65642705cb1daded89c0d697cd42f9026e0be4662728d0c2aed752e72a1aee343c8e58242494d53fdae0108e31acec086fd6bd4c9205d0ef45992337e359e5a097de20a66e7699757fc34d600c8af511cb71b4b2b3ec6e0aea3d98db4bc10f99209c6062c6973f46d761723b65e08c71166b49dd8c40ae5ff6bbc5f49c5220e8ca7b7a0b8f35ccc08b6817bd57568f7f0284ad6d4b4824d0daa64eaba8d5ab15a119242bf6de99ed8a44ea56716d73daef85e05ba13a57cc464d6aefc0c7a2223f28b998290ce4b65cfd7b41417753f7becd517260af237d086b2e3a557e59ecd8cdd8b45fb71a17d1c9a0b906e12f56ddd3adecd897d6ebfaea956bd8523009d82f4b1afeec6cf3e48154cf25056e3fece62d1a0842234400881f10ccef1cacd9ceb60f86c88dfb8c465ed44ea4ef2616fac8a1112551e1adda9b6d03dd0f8ae626617da39de5500812d8c00254c0e34f84be0b25847f9ab9ae37814384098170f22c525894a7a5aa0ad8c7c1ccbe3d86804827389012b0d794b3df148304db1728870ef887785cd5c0b66b51bdd1076d084e1a72e6e609dae5c353ac619c351e7a77a011e1f1a72d7f18170ad5a12691288e606c4703b6c94ceb386b528e5ad64a2e9d311b9648a96862c1065483dd102753226bc81c03052b45796464ff90feed0483b9a44f0c7d355671095f64568b1ae0abdcfaf2b6c249ebe008411360c7e1dcf21a4099e933e3d2fbbc78e7676f17211127ca6d54309d35c461616ea7d240456ed6d034cfed4b90d5b7bfabe349f13e2f365abce59c302080625e59aace140e84ffde77df5f23318a239ca8a0dde83b451de43877c96a85f818abbbc21c4acacbc57778dbd11d73410202a197aaa4c00be41063f76e425e9218bef223f746c6a8c36abacbf8ee457f27877ac1ac60e370de4daa4c1b2229207aee638283d34a78b78ef6bbf179116f301f0ea4f2143c58f8b81633645d1bfe1333ea67d34068bf3839a5cc75f5fe97c30ee0877393c6382902c07e1ff1c92950ad8e01520dceeb1d57a6a42023eaf46f404b4ede44860b31df9a658989afadd44ee73587a5837c021cec265eb2d754d34c96172470e10ce9b024bee1853c8701eb2a0cfb58b6b1896e38d96773877ab48121cfdbf9e35108f01424c1d7d418b9face42ccb0656b0a8a53052caaec6776f4e9382dc2324206694c52da60b5b6fd23a27f93a3ad0d81d0431596c71c0f9d4309f448fcf4351ef7bf41e1ecf24b221c657834c4ff6e125533ae48c58d48e98b7c1412c620a041ecc7f749c769576756c7949d6acf892611dfd7c1ee38faf8b0d3e92ca39f03e208aafa66615d437a30e7663303df635363ffe5f468e3292159672b1bcea97a5b3e0c4ba2d75d38e52b210f4f06adf073c758b135c359564fe982dc0d54d6f40b4e06be27a9f6d136cdeef2fbe585593a74f37bbf71541210dd115db7f132338044b909940d3859f5ee876af2de8420b3e4aff58dd0a4bc88496976c7eb265c0f0436e29dec9c67d292ed8ab6870cb7a35a87522279229324379d94bcc7a932b191915befbe88f1b3438493012fac8f33a51e0d96a773370d601bf179372facf9488fe513d94a50f1618bf2a06d0731dc51a7bbc2ea852a58b1a6c6afc3b83cea075e87db728b74185a693a7ecf7690b5f61ee793df7973a9c47bc2f19bce30cef7b33869d783d0e36b14d2e0ce057b032a1f6262d9bdb6acea14f420ddc99c35c054cdda856525178f90513d951bcfd6b14197700151ab79beca9312596b0d81fae274a69e8534ecad21dda0b83d3641f01c9b5d0d6e327f141f7c6561d4a103ecd0f4a78f2af1574dbc573df0adb707b8e8b9c96a5559d5bd4db713be2f182d57d403ce6b688fd789f98ef373c6e00804ad1a2262b2b01a07c80619c617e137601a996cf927dfcc51e71fb6cda5d9a510065e20836755c2e925fefa0e6657c0da090cf930542e2c23fada5da8f3623155cc2c4382082882f9f751715a531b2446d65570bb0146a99dad50805f587edd8c076560b5aaa8d6769c225446fcb0957f6c8f058db36136daa47adf6fb3c34f7352423912ae0527f356c3beeab19b879ab25aa0dd59c60acb1be7703142238211267b05996aea64cf679f5f34d1ecbe8f00ff88f499afd7902c9e560f1185735f8fd5832206db250114e959d19e77910f2701ab646637900944b761c67886bca1b664ca37afc7bf76b826f1508a0bbec39046dfe2e388417737dcdce014319875e731ec0fc055478fd728d43191ad27ef4c06324b2925d0cafd18da256d3bd779748036216d969e8580719083508018190d6877ba7e36cae045532c0677bc811964fb7e5a942b2e901c1d6e830587a47982645763873d9f99ce4dcd1d63c1485fbd374d4729b400b60724d4e9829b2dfbca5858334e4e7bb3c83377604243dada2c53154b905a038da27228a033ebe793b570bdaa8c9cc9d0345c6e135b09111a22622ca8a4d62e857d0b4e0907c433cc3862890155287b1a26ae82e9a337f0a6dc543675107f8dc96b1f7d798a78906a656e1baa7ce7f6837dcf99a0ecffc885f5e7f4f6329a657b225b5d83cf4169a05964279af2872060b5c6b817d6fc17c6ef2d07fdfe1877f21730dfd6b1db3b62f29d28147034d62c9dfdc0a3731704e8e5c3bfe22aaa3ac4618eb63a2af37ff3b963ad3aa23a8d4a0b66679fe37b05f9d4a9ae9ad6919a3acae6ce5f46fe128b39d44a66cb8128f6146217b1eab6bc2d1a8b31287f9c009fc3c9caf2901a667a88ccd678a7cbffe58a95f8cc8bb14f78d10f56d81e8f763477717c28972f465aa2a64c51e9196384a31eed8c31c79bb3b15e8f4640a273d7574969f23aaea1c0904bb761fb008317ce2cbd74ee3b9865de4c1ac070dd66b9d09916ba4a4395d479e294aa2ef8b75cdbbfe2c05730d2500a63dc2ace8d48fcc1b7dc8b0dc851bac60bdacd09ca3ef574a5aa16d055ffae35618fb73abbe09139e07f292fce58854dae2eb2dac30a5593b0dacfd96b349925b65b061dc49d9d79ab676d34969fb804eb82e61a54d3960572f2d63cb62c8e1e1037327e88877ddfb2662a630e2c5adf734167b3db65699545c48b1b839d51f0e7a5030828508417de491d09597d201d1a333a54b4cb0a43ab25867650affced86495212b6da039026c980739b3cbf9234b8429308afefde2d7b6bcda2e9f623a20833e40d443e81ffaf5ddf478297c959a1eedfe9f36d52959cc98fbe3e9808ac0a381f943039f93b6efa6f0af2a6ca2e44a82c68a1ede38acde7d87908be07a8bf5e5d722d64f05c2f3c80ce66dfa91611abbc5be89981623b0fa8bf55be671dd2caa0bbd07c203e53e5b016b19d3d27eb02fb5585f87f67ae877790c7365203e1ce29c80dba3c31ae31f0236be390dadecd2b06b5ec7dacc08ce15a219152d2419619b639840b66dbe27baa02449738b171872d6a5aafac58f68093157f72e612395f1ef4b62dc681f00b6db91016b2cd67cfd46298b84fe0a14ae112754529e0a4bbb1fb20d9c93e1029f87c1c43b2af3e45818185f68f1bd23519cd280473fc3135646a0dbaedd1033137e2777ad4e6d84970556d1711eb5cbf69d943e4bc58f9dca85117fcc9e9d52222097d756378cc797976d25dd555c51703151d7b5e1ff297d7d8051dd56d0644b4d1a4958ec6c4e3132d54655af1fbfca46d1fe25ce5b4919d1b967fa02d481192b62179b6ee3eee92fd5390b69c97ce671244e53a6a6917d3cffbf2de0762e5e9928dfec5ab3c78e6c2abaff7e0b59879cc55a40f4c030e79e5485bce8ae27a01291266a934c3c1f7be63be399e79d7df3ae57e9397e967200cab1f9ea1e25385922596891bda0b3631de3342f84c591369169104430990049e2430a174fc4cfd968852b798d21c8955b01f9051e599d807756c3da2e6c78248297dc3480e4c8a0b25f24bfb3f696fcd9fdcf42e93ddc0aa4fe239994bfc956e13409386fb695a2c0f48b58f45decf0f99dbccd83e860f720d57ed5a72e7ab227d3d56c2f2b983e16e1cd016f428c72672db2d78236a3f3e34ab0ae90490acaa8b079f3ac4ce7f65dd65201cc3ccef5af7ff8222d97deb7625583027770e8020cc5d2d859a4761b27bd8099a2eb9351efbe5512a98dc350ba380f86ccfcfec74b57a9632613465d73f40a4dcffd368629e4f366de7857c8135cdb9ca174a133aad0efc0668fcde38c1204356004e67fc9d2fcbdc8ea0a4e277dcc82df2f0d149bc6d9959ac9d5d959fedb8cba64e3a46237d0c508bf3b268d973e84699c46900d0a449066d3831c8e54c704c5008c358c0d4a1d47e5c54ceff32e2d5108256e69aa5af45b3c912ae3b07daeedb134d2479824e616dad7500b6e098b8607484fc78cb7fbe3b2d792615b13f1c3022903bc27702374c8dbdb09e603c28de992cd9240263e64bda250fba266cfb770c384dce38115734fc0bfddda6534e59286ba3c84f6fe002334c7a27ec0fa5bfa94ebc3eeda9b40f7a1fa8ce1044a6507b1e661010e2ba2112d7a2c06d81176113d18422582d42150cc1595d543eb37831e4dbe699a1ab4aa584e86c2a0f454b4dd2cda20bde5510c9539252741c39da6dc15169463010d971fa6a5cbdf9547573c0be2df1a3248c1d108c22a83c1d3b7a58c061fe87babbac3ddd01bc200d5e431c36c799bba4ada84bb018d078916265cd082de62f4dfda543695bcba0d7aeb4dfbc688b54f4d8fd8b5b4556234e3ec611863a275eac2008e9f4cdbbfbf148423b7f325549c148b74d21b539fa5c05042779101fc934e32824141291e246353377b8666935de04aa8309a6ac32d206351b281da83ce58daf02ba41b2320a7848fe3c68dfd57bea67d5587e29027d2e6a6af315e4a0945ca876e49630e7ab5dc96d34c79bc935c9f796426a8dc86a8ff993cca5df5806d6138c285cb103cf89a5a23b25e484e0cf8c873c89ae9e0bce7536a4e050ce0198d30b9c698e5384d73411acb478e593a091a81e30d80a1b900658e1eade1789677d813610ce3673fce2badf5960c99a7cd6340b1075b79420ee88806488ea60bd14753f407a30a2ae4c7cff7153827ff069141e60ca535156dabe3dc795a6e54e4c84c838a3bcd9bca5fd03a67b055914760f43e33afd6ebffd6f298b5592d43ebf3156f137880d72cae0e3234539767764c14eca73312eaaa3f407b553d60eb62063c175c64067ba76a22e9c23c9799c690fc55cb7e37c36129bedde36203770fef4a7133e38a8181ef3794d9d5ed397f09fb6787aed635afca55c0d99868b3828bcd718761635ba875e71d489a505b2c09c2fba2f7f2dfaf963501a7efe9a2f82f3e37f06d580e50ec42def4365b59a003fbd73198eee6af1cc80186be2ec8f36513293ee6203ef04be1e340853b9ff94064daf5f6303756a71d513497f819b72e7255a7b85397550b8ebf83737b13090d7c2117f653cb764f457e927b74c6a7103619a31fea5c8cbb90d559a2c8083e40da2fb3f2cb437dc5e991ecfeb671dbe3a1e6db6fb13bbc101779650fcc2ca52de59b994a8bb132fdb69beab39ab2157379ae9d69929b96d17f16a0cb9db64f25e73f44d33ad02ae4f3c366ff1a4b6563a1e9ca5eaf566693426d58bb92eb070390aecc1310fed247244b05789eeee0dee6dd146d4519a7572939834c939c7f0fe7b97e605be12579b404a36586ae7e3ea83656cf9575b913db5450fede30b034f3e7c7cd63e8b78877a69c86c795089256145b4c47b25b01f3f58a7e52f41e198c18d8ccf7e96127250c1763f6c166cf3db954baf06c894664108bf1acc9f8fb9d31fc6484ac106a1ff569d049839478184753d9e7d9afdcfce7818165ff7ab18228293765b256289fb41484e7dae3be1c647ed67082744a60e1ec0f91d63f1a01c907f009e33271278155c090f4290eaee8278f15b0bbee2a68be2d3f5b20fc3e1778f9f2fad0e2c85740c7939f2d170f4b76f46c603c2218912268923ece641e2028979f08ad82498a6f50e8bf223c17985568100ab34cd08eb9deee3ea258646bfac61e3aa6f39fd7e5c0bc60977cf30b8114c3508705c07998a33ae38469e2101cfad146ddbcfecb3b7f4e345560433713c1dd39967013f50a0c66e7d454a6a63949ac4e6fbcf157c5c451639518496688532080a6894c82d229f3941f955551c6aeb4aea956d6183aee1d155b5f7d76266ba611ee2a0598505d8ea1f35e366ce8b39b4c0ae2138ebe8c4c9461d94120a4d96630faaf494ec9204e90e95cf83c6dbb6c97fe896758fddf53b9d81ada244af842e43b2ff8df8a39643d74bed085aed5e104a2de73c8669f4d74ab4c5fbfcd06f8c47b96fab3ee94c3cbfdd1a1133f2ddcf07d4abb81cca0ed03b2b902e6e5e9496454491a9604bb60785055dd23c934b6a4812c28c370233540b5c253c775d5850875876292f6864984eed5a7b7c08cb54d5404bf2369342e292054bd0725a0e1046990295d0caca7b7482644bc369ba1ddcc1d002da855fb8c1b7a63f968df3984486f94ee7e9248eb0458cc1883b8903c0dba59009167fe00f640bcc74de5d77e84b9582e08aa782b9ffdcf5e35b217cb84cd4566005e2533e94db2138847d08fc37fb749b120833564b44cf95f081f354ebfe574cafdd914643059fc43216edf11939198f342240e0555f1d22fc8d73fefa6128d2acbf864970f93dbe8c3c85b34537a50cd1486bc12ff22ff6c68d4898a63c7192b2583178c3c113021afd62b69032f14b74e165e813c7795f2a5650ec871d4d5197036c0a62408fbfa861ee5c32e766e3c8ace926d3633a53c1654b730705b48f8d204ad8abbc3e096c0bde133cc1603ea05d2c7d536704204d80160c53fddee5682f0ea1ae9c4e372a1a1f81db93f06d6140590c13c252e5a54d8774b6b6999e0b1addf62d0a2f209592018ea76165e9378a9f830dba1120ceaad44483e112bba668d98ce278a42e84acdd16d9fe58066525c27a45425321f858a44af9290e14c4d687c9d14f90420e6942b6abe03160241d9612c68d3c1746bda69935c15ec654f373407ca69ea3c0bf2012de9f60cf5df7a8bc172fd98e55d5493a64d3fd0d8d937cd9291bbf74b53023677da0d373132e83a0e37770db5547ff38a0c37c3d0615b318a58c0e26ec577a597a2577e9d6ddedcd3c353d5efe5eb3d5cc4d800aaee811a2cc556ef537ddb0ce184a3f19595c3cf5a2d4ba23c2e67148c3484ff4bbf4be31113eaf70b2f5a629097ce4d8dfa0b4456813a4900c6a137caeb6124004c469b80e215213689cb0a97a303250a63761f0f9892777b7b52618735ebdfc9934cd9f00514b1f1045bab5eeaef481c8f555f09dccd94a98078904a524f7982a8e4e7182ce428a9afed6cb26d8fbd3bd90f86dd45076e8f7f43a1ff52cda96bb1841710fb69ceb0c70bccc8312be391218f3a4fbfe6dff2d6d15e2a8f0fde542d821f6a73a23d23aaa4ceb65d07efe9b1b858d15c6b81c7b51f66fd789761d77045848f25de5cc0cd4dc6242d29e2e33b341b88dadaaa0b0373f9c234130961c5f575b35b316343909a2ef5b41b116130816fc68d316b7bc174294afee8ba3f4153930d78624c72b6e779fdcb6fac465c0dce161a40061022be71893cb0af595923291680431479a143bdcf682075d381a6d28c8ac1c57cb831b93c17801b4b72a8014e9c50a72b3f00faba08186a9b42345be4ab0417e671ca2809ec35e5b3f531a9d15240c7672816c0bfacd3d30b7a6908276b5d72711a647fe8653dc47860aa3bde3b94be03b3a44535e03a4023e90a45c35761eed4d06dd8179061a3609d48360cbc4f48a715f58a954f00f45ae19ba01c8c88e02dbcccadd64ab3e4b6fc23dbba7cca7da48708875e895a78209126268afebd09c5d42c6752d56203487c5e6443ace077d69744ba35fa0c230b894640023dc5e4cdd35dd781ef475529be7ca307dba4eae25e5fdce055af93aa5ff871c8e8f56f0174951fc0892b823c05f25fb1b9f1126923983a57ac8e99069f52dc40d9e3fb2e1f3c4f301a11550eafff5efcd3295e9032928687f2af71fd029e47d10f12c8c8b570a10819a5e0b05b9d2820e82215a89752e5e134452db778c009e6f4678837b7850143204a50c73017de3eadbea2cfef889aaad17ed925bdeb2e77982a047e51668764c634f427229346d4072b4014cef7c7d080d9fc522d501b9cc6e449d567f3a9ae52e4973962048fd2c2e707d50a4f41d2970c56dc2e574ff4cc50f43f0a7b425660540ff669c715c309f06d6a64e23283d560aa981ace04bec8a3506ccc2d4c5b8664374bea85b94ec8d739b3f2364a40569fdd8a039f1b8189e095eea514c6240912f776a503893b5d28aa084225159dc777ceeafbe65da55a65c6169d8d30c387119e49a13ba7013e9af82272b1b6f3c65ac4bcda117eea944420c94a4094cbbbb3a49e52b0e4cada1934a0a2f18ba4b26a449eaed513c1e6de62ed5bc5ca1bd2e7af4a339aa6bc610a996dc7de04302c84890399758a0a281a39df8478bf8b77d6112ea1629cec7ea4ef4c3279bb8cefc488192a27f4ef1c945d0033dba0f2e668f0572b2affa2287b53da51cb3df65091a10684b075c310e3878a4f60341a690ee8b500c3b2d10323738e2bf8758ac3904b67e2953cc56433c8979954cd39956cd46b9b56940a546e697b22f49415fd8aa8feeb6e4777b37e3c65b77eb86c279d7fa5abe5a08bb8a526891775476814095b7f9a3d642a2c381f58e15d5db541cb2b9fe0a50c6a44a4e524e4c3b51d04a06d1a4462cd1a6d8770e3c23a894aadcd9b0d229d07b1512fdeedc0a69b71bebd0aecd2a09468802790609a2477b7a16e21d22581f4a9f6afb10a1684b4a913cfe5467a5dcf033898a9090a1b22f30b47241170f35beb39790fc06b952a349ef2a561d3f5073ec59de778d3e86caef5f5aa99f0fdcee5cc11cc3c8c1ddb212c43997442856fc655af0e71e966c4842b82195062a4d2976743312b944f99956f0687209af96d16d6e24f433808918c7b7e42d962bd6a3da5ae7fb71f2e6de9f2fb30954c845148a1806e383fe72768a829d3bae18a059c53d0ad64e034af92c09e9297b2a83d48e28e9ff4882b2d1ce927e31a394767633622ea290e33a615ac8dbe39e3a44c98f3c704d296b350bc60b8be773380e26fa6df74953114148ecae8dd1e030451364fad3fab64eefcab691a9aee164bcf09c39e668c00d0e9593bd4bc48719ebb99d973d64eb59dd0b65904672912aed69b909ac6b5054ab1114d59ab584f3f64049b02f5a09dcfea480252019044ff199a3e51634c34ad58c5c3403536a838c5ef6d01036427e8fb28091137e30e569c4d5c0beae8a0910392986f2d7ee56a2be4351b19d980cb19319ec571a5d09f750659f0a33cbb4317092f43f7449f927901d64ef9565e6541fbd037bae0842ba6ef254252ef9eb8109a236ab015a3c5ea3d5dfef50e2d48f83a1e4b6a2d964dd4540eec5c10f6f249d6c3990b10d42707e7018ca7c93b14ddb4fa68c6ec004853bc1a6fe15e190fb5f60b13d374f7243a56f930ae2163aead6d43eafe575f499fb684bd5c711d08163355fd862497ae41ed6bd26155c87ba96d39327527153f5092604bdeae3e9c318849bd2198823f24390fa65724f18363bcb194d95a74a364f7efa334a1a0870e0ab0fe39aaacdc8df300f27ae7c56cd80c0ae1048f39ef21cff66beb229cd57938222af17da787be001e8c841e7c99df30303be319ff5be6ce7a20f830bdcfa8ab7f7fbd14592c59e4e347dc2767c7749b0dab15a4a02ae02b90220ba3c0c853d654d6512dc10028cbf7e62ed0ce2e370b397961937cdd760b795fe9c144223af28e08d0b3cbd563e4ac9e8f4218f0a2621a93cfdba7798e638db5d72a17496efdf2f7e80d6cfb2fedee64f10f30d6692c72601131ddb6fba51e212ef245f2fbecff15f7e2c9bd5210b1c2edf64959adc6ce2ca14a0c5b183dc9ed49764ce7d09ad7bf5c9deb7580b1de4fb47a0258ee764c477447c5fdf8debedac0c07586989dc5cc1b0ceefdcf4b9c6b2cfbbd1663a195dddd9b9792237ffb4d9a0e701702718b86bd5c2dc1d64cca75a1f7fc8916677ae9d36631d6e0f78056975744a2b4dae2fba8f8a114b87f854cc146122c99021e9409b8de4064e8dbcf191cdb25134f17be422ab7e307fd5c47a7e9a625685c0bbbaa955360b261fe6c583c6eb77fd0fe8e084d3272d9b679a8ba428525440c619eb0d4b7720eac764349f46e05f2276627d8583f004b437d45525c0ac91bd6980854323f8e3a3e8aec75548632381c7caa89c32e6e4a2a56a5746834d5bac65702236b3fe705d499f0fbaa2967e5b0a717dc239719487f90a126e635d0423dc13a29a5570a8c37144e1cdc909687b8de090bfd46d2c7d74e222a5e81b41c49ab67892aa06aaa7ab843f5cbed9faff8ea5ec6f777de93fe55a58fd3cd3c570f28a8bc5923372cf41d8242d4e568686945553b99f77153ea7dafcb6ad2f5998aa1ab4c6562caa8bda4c23ea869757d5e30ece1dba6f6092a66e5e5c351bebfbe824420de6e7d638953a8a68f9f09bcb686bedfabc338881cf0972b735598d6cd634b94b6c4db3793d1032f88974383927bcb9fa6c73f229ba4e4a58fdcda658ca3cfe044b2bb00e270c22620416df14bb41c0bc8965398504228cea20bea4a7d139eff4084a51136e5b3c57954f03a6284373866caa7ebaab422d72f51716df7fd75c74b94b20a97b1a10e0358371c062ddad4d0296bcc1d0ee93634c57cdffc14bcdd568fb9771333ebf256b4c92f5601516e153b91c1aa534ba2acf6b0eb72750018d483e97d985921ca0142500fe029a388b0a7639819b27f2f0163c0e53972ee2e114a938d239eb19d6776fe6c24f21073d6b293521b1f020bf4e7b1caa5f5815accba624271e1b080c8ab204ad42a95d20975b4665bdc21800b470a9992b92909d916d91b94784b3113368857b54411f6c06e51cb0add7a5e583c386b00e62705c4baeb32584821cca3482e2a783bc1cc198a41847e58f18a5dc589fc606be9c8623b20d66cd8dd02dc2dcf32a81a84092862a3b01c3f2c12cb3f969d74c58076f58ce12813da1f65c99521adcb7cf098beb2456302426cf4b7c3bbc09e123c5456b88a25a35ccb11010ee8421d10e000038ad7b5b375b8816df3a661b20d947af6dad51aac952d530bed1e4e6f64c33d14b8a7963fd69dea7300c963c6afb58e0dd8d2a8542d439118ced7467ed5ee7cbe9d3df8bb847a4db638627c79577cd222f5ec1f5a52cb4d58cc20d3acd7bbd98e48b4ce2a06736a9ca0213e2c959a15de703fcf232cac5a5c6d3893ffb0d9a770e5360f91ac3910acf9d8e2403513206f1e8e4b673235b29e33aa698d9370862c1e49bf2b0d51660b6e2143f345292b336127f1450b5001d065ad2f5f88ec5be123a2eb37e85d1247c3a7b7c3f8404e2584d0bcad4f225221f5bf2023f35e7e653f6d305b6f2323ff01629f7b6fcfdf04de418ffb466fdac7a4f7ca0751ccf04914d220bb2bec46aff7fd647f95606940ba41c341ce3d45fdd2227db0f6693092033fe87e76b0581671ab1b912255d0de0b173194bed47b9d04f1da63d2750bfbe29cf50dfcb460f35bcf276e8a0a0d089f3d9906a589ce9b02841a1ec142509c1870dea999250878db30e0c73b1d0f76ebdcb4154ac97b28a5e92e8a042f9494e2b439ef341fe587ab3322c844c2977c251f254ab27b52582d73ae687086edec206b321f1e791effda8caf62d0aef8962ad3151ead5ecd8653870076242a35e4b999ab4c5900cf12fcaffceccfb8617760245c3e8514d43791d3ea29f353abf61f991376921a090b0ef87d6b3099471062b563830163984ff1a0a0e8602a610b9e45cc9e5a1c444140c626ad24c34672391fba970ed61bde8b07184ac82e90efc9e2301b5994ac8f334c55472b99f15405f4246266626d3c7965ecc13e3653f9e8dad6a872337d86f6e9c9296dfded3ec6c149b3414f8fae90c88c6a7f303e5798ea738f83062c5e3ad9ed991640b3ae9950c4439a6378c81bb9a37c4ff7f89a65daab1c853d6c88f513e0d97f77de3915445281330e000268211787010e3d9d3bce25aeaf1b33d4047d25cf19306a374f82b19d8f3667f6e1d26eef06d9aab7b813634d49c1156511ae5f1ede0d58057bbee0fbfb06f6f1678404001b10201534fe2820a72a5c5751d1915a3fefcd501a7794f79c7c911d3a5806e5999aa97001191d85c50d02a7f77c29e3c60321c35bf9a3115819e8d6abd6fdeaa28d636a1ac3ab459756e544502ff783d68fa1c33483a7f162cb5f89c8d63f68fe08f8febe27b5c1da5ec240eddf3feda13fad560c457b779f6d70a39e39f6b7e92773d52144b67338f582f53ec7269760d23f61dc6ea5147db66c95b5265fdde42e6ea7711b6b6ed4f82c239fc5edef718f053667ee1634918a16c99a268c5ffd8ca2f3e56eda4d9cb73f6329c70bcb580c19e571861d3835df4f649f95fd1e105b2682aa59e13864f209fbece27430128aa91989152c8eb4e26f3b23000a6f321f7a9347454edf6469f383f48f31a9bd1b0f70708ef8b81c702a370d25acb954854f6f5166128266b452146cf3153dada0205349a5977068c206c841c81070f80ab9210d56b4bfa66e534abe9c8ec4e79c0127ba7689e423182c0e45be8d7203c2aa49da79dbe5b4c764a0d0b1c5ab7976c697d8f6246c8e8a1124c7fea3cd37c64e140a7c65d2be4ccc2cc2fe65276481a2bfa1a0394c208428797902f824aff703c001c5b0c45e10cad5ac415bc8a434800c6afaa2dfbfd8d213d3d96758619fbcbdf1158ce983b4ebba8b7aa93a06fb2df176336ee6304c9c4aa811760fb08c7eb11e71597d766c830a83fca149339fe07f3a796c449c373aa6409fd5bf9f0033665b6ab4e908aba08dab95a45e515469652466477bb2bfbab8bb081323a6df573e0fab7f4bf1f9ed1d40102ac7ca849f4e89bc7f47f67b7f00c43d721daad17139003fe19968e351d8b77ac49d7178fac206382762d3e9b91443762c181d420d8540090b926b85aa71c766b90559fa6bff6caba8f8a9aa3f8a96e88ec367c43342e124f269147674128d90f2c6ed2c2186fae1b9500741a66ce62b4fe974294077729b709105f1e5e2c43d7439315996654bc64e5a08901e8b5daceda8381abf1efa241a1233194e8d31fd0deea2ff32ddd14833388f295babae41d58dfe2d17da36699446f1b47ad7ea9e18d9f4a657f6ca5606ed99b9ca712bbfc1e69792e11c5a50211d45fba1d9660a1f86fe15c916494887258e1023c1b4869d45f6ea14fbc04db3a48a8f8c0346b382f17bf78bf2b6d2275a4d330738bfa282f56ea7dd2aee56ad305477192d88842a5f2ed6da63b4f61602c9d358f562786b4dfc890e662ba4bc2e83de1dc37ac0be11cd05085df101a30621556e7bec294c5244e776ff41778ee07fa533bb778ecc4c571ea24427a5ae7e908c2c483575cf1197dd9dc5b1172c4a78f331927a4ba1cf963da0d6550940b4ab5b2a8a792e7f121be6210b1fbc4594240c8e8ad2a8300fb4c138179907d761fd24760788b99b3e4101ef88c1de671a0bb565835aeaae56e112e3316d7621e2e1178944674c79373db80c3b899c2efa827f2d222a60c67eb49cc6ede12ea5e09e450d751766e706fc7fd309d6eb1edb64d67558f815a63cd45a85e5d825bb4172a0d5c8e4f7f38acfc411adec25a325a36fdf607e9960cd00e11016a365c5e9e9bcdcdc719af1f73c5fdeb4b4f8448d63d7d30e0ad8d101bc654c1699dcb4070601386d3d2119e44b000dc9cd2818ffd4310c367504316a3d99aab9e165dff4b04cb50f3a0362c17a8e409e66781daafaa1d1d6c9c6cbb8a4fd02bd1432516eca44f42ebfae344c765d90c0e5766f17361fdd664c46b32f1fa5ee8f60d599859cfab895c40b700da26eab7f323374091c4ee768d941e28cda009d3bb5af3957cd74f8e987226c0b86c2962d8d3c864b04d9f31c1682761c9da64bd1a4e0b7a0624da704f176240aaeb75106fbfa760f2c20658c3da4b37b5cb320a0d097e185baf9f3d538e0f16347ab62208b56a2eef2e8c3e305c8f275dc89027e3de87b35de1753a627b019fff6b3f17294cd651191d5ea0041f705990ff4aa788373a1e1481e1c3fbe074a5a11f870a1bb7aeb541678dba934daa0f67c7e0ca736a19ca9b80fddf4c951df6118cc3e1ff1e940ee0b811561990b3ba565d888c496300907856d0c001aa70037a2a6029970eaf6f102df2142d2602a56ddb663c0bb00065bab3032e5398a7eb3f7951107b26295c0310f314b0f763ec50e9de4829cfa780a447bc4aa240acd307714023028f4e2b87dec3ad724adfc7ef744dcdc214435ce2255783b10f6bcb2061288b6a58d66fe46615a0394350300c5e8f87f57c0f1f702825bb8c76af947fb4f32efe60a8ad5328451cf298f68c7ad69ba874b765300b93c31ab42e8ac4d5c8449d7dd2e4732cd571049ac8bd057e885d7d0241e5e249e70e5f353c46200bc037dcede29fce6518e31f8808f5f8358e87ed29802e3e4eef879ba2d2f3cc428e09bbb46872b4a23f8981cc6e238a2decfab09f3b9403a273abda1b5212b7a0d80b16059b6f9f5b34e5a12b3b5a8d77875544215737e916136a241402369a0963a0e84283f60b35bb3cf3047474e39ab717e5abd57d8508561a0f63741f77db46f79889e31cf15a584658ab135363d1591e16d253948f5b0c086391fcb2aacda7c7c815a8f870b6f171596643e99a0fde5fbb211ecfb0301d05051a52090c9dd4f5d640b31c0b45f7c027743668da269be99c9a0a62df8625b56b099470eef977587555b9c3ef0c29f89aa8cf5c63334309c8e20dce073b8cc660774c05625ddfc109a647d9efd14c024051f14c23dc8853aa98c9910c14a4888bb35cdc889774101b5fc6023ef32a95185e6b720336898c8f04b97ee1c2e4b92601b397aee9b20b9061db7930da963687c7c93f9ee84880c3e4f4930d80e5119bdb2568936644678c6c0fd2a9f0f5298acb5f29798c91c36d2727cd9bcadd97249c8de9c418eaba2f2795d2b9a353368396122ea40a09caa6508af66e332f92004352e0dfdf67f3c4dbc0dbcb8953f1ce08ccafb1c136fda845fef7c847ab5140a2512a530066082c251f86f309011dfef490e11df77474856374771883d33b7a41bfecb53bd103164d1ce4a22134ca3b52715898d8a5549a18118f9247bb319887731f9701d362c73b2277fcd3224d0654e49aab739ac3fa2b4e24dc4c8fc84ebb8b0c966f03d959501303227a155b48563d14fb5e1324023e85d12c82373fd0b4259ba5674f8b0ae5279813b1eb57093bf7b65135148e4a21a692ba0f15821c7bf53cd81ef30f7dcb2319327adc3e4e60478a8ef992244b8e449769de836cf548fca37d81756e617b252a74592f6d0d7bf7ee0d69109d1d6f81f2d74ecd3fb3ab0ba542e0eb434964fc978ba6cdbf1b46245f2e2199586ca640ffde4f8d06ed515b33921dd342e223356269cc77cfc983dafc23b780aa97e57c22481b1d3528e29a87e395a535e650ad2c1bc1235d4f2aa79e332b1b9b7a744a076b8816ae7ab710dd5efe96604fe122341d3c760957a649b2a80cdbd6de749af45cc7f39d3ff7b52f77d2f22270c7253b5b43db35cedefa2697453bb5a86e0990a798ec7d736cbcebcb1c2d79578877ea4810c3486b49efb56b2ccbee1ac519acbb2f39526dab1bd771633a8ae203cbdeec7685b59b2652d57ce949c9358f5f170468482f15d39fa98c1d21914408211c52edc557d68109e6475af6b897d2dc56c5a776f5f05520f2bde5cb10660dc1fdaaa206fd1c3961fa887be7545c8f0f7c647155fdd9217a155fedd375fac2cd8f12b56ead070d3710eaae2b95777e579f4520e75525f38481a6c2d9b636b2d02bf37f9f34b81a90501483fece8ab9ce884aa61a061ca9b7b925906584194effa483a8f58d4d3ace920acdb0ca27480df82184be23bb27e37a0ab6914c199dadb1b8e1c802a85c33f182f8f1eb2c9189c59f57611776f67802b2dea3d9203132876e1524785cdb0062a74cf9ec060821b42a48b1ee4eba466a32c2aaa1c9974a28cb2fe20408c6b0f43cda4d3c957b2cd6ed543922ca236bd52cd4a14c57c8c57e9573f07a91b1b1405f4d4b6beb68d495341e1cfa34aa4b846674af140ca0df15cdc1a9c6e40d2f114f2d8dcf8893c2719fe0881c1aefa2df01619a3be34b4e8c291b2fabba5ff5aa46a9e4f3e8c333136b1ced1daa29c2763206b7cd41444c65c7b0fc584d28036b581a00e227006798798f5ae8d757cbe002e5930af86d5ee48dc8a4e233acb8592397f41f6e7145c9aff172960b562ea86ea03e1aee429dd42c530a7fc430e239f76aee266cb97651910be7cac8ebb8b7a7bd2b705f98f0c62a981d82cd48d285564b2b93e973a7390b91295cee2974464b2840d952713ddc1dc462995605a181eeeaea74f27f7218348c1bd4e4c18dc263aee561c9b88125a156e25e1b259680bb87b14e9ae6e85fa6c56ebb5b872c1464ce807dda1e7c5919e2e27d5de28825d7aef93219bbdfbf9376d449e65f4dc27aa9e4241b8d3307484806571930ff59609430375a30d5f6573a6443bbd48bccb49bff3b64dc53cc6caaa8f2f8d4d505f419ef8401e7da0d4c1e1b0c4b0ab3b9ae34770bc2cd7253f9c4569ab08a2fbd4a557449ac78393fdd3ee60949639d7b151f9e30bebb36207b7e230938c67133c0c19eda8a4f078af08670a368f937d7696200046d28c1c0d136fb24acbda4991e22aff673c2353b50415442a44804f9d6d02949d2b3eb71b279343f1c53bef31b0d9e48690eaa216c48299757fe601b96061f2f40be35d8f7f0fa9263b7445016895ecdc7ff725d03e5d34077586e80a620dbade5d619c15a0205b63f40812431d5162fb6eb41309bb052859528bbf641bb1794043aca62a97cf0df55679cbd58e4756ee82f3107febbe382db62598be9855e45ae461a14c8e4934bdc0de45768bb580444489e4b3a7bb19157c46fcec8bbfd917a6f5ec6e50e06e17080ed2532e56a666cc0612fe1ee65cf7804e377083d34ae48aa303ed859f0d36b84cdf5f20571b97e7f60fcdaed3bee2ec126bdac42d1c3765d332d5f1d3e11e4df21be62d7eebe6712240c8771b0721418880856f8db8bc645f9ea7810e20b4c6718fd8643d0c314d0b56d1c55652f9de15034cd8300b21641d6afbac4852b786db812732be6445afad256d7b4edc94fc2fcb4e064422906c6e0f588b17f3bf80487fe978ebfe111e5bf0a0fdd1410c26f1b7c1a11485346bc24f0d8ea396b39888e20871900920ff2fd974f6bffee4dfdfc2f416d330ee4bf0ad8bb2b7abcc98c7dc92443ed9af4ecc3ec283bc137c6a66488213d42f925e18dae57ea6611dce5f65b17c60a17a9767fdd60d100deea8dfa85340cbff710be9fea741f164955aae9c0a9a975dde8c6603e66d470863ecbc66c94a2eec03700bb8bba6304222497104509a890ac4ab0bf08d3ec08c6229ff5d3284f33d99534023127f5382133690bd552980266c71215ea7fe0c2106410488a809c23e29e30dd3fbfed1ad4eadfd32a13ede02a903dd7146943156829c422be0dbac78dab3d32590904f512035a4d09e8f5c53e5b8e5bde57786ecde146aa917657f9700bcb8ffd6b3ad960bc6f92b1b2245389bf42db96956f191afe0e058e209478dbe86657dc1ec3d9e9e3dd9a0f939e5a990e0db8e2b00a56440f703166d21f4c6ed9ab9983dc3d4232bd8318787c2ab4d666ebcba2117345754289f2d57a5c9bdb16cfbf3370fe8368118ea43e89f849f7d8188f0921e576167e0a7f76209b81d2c3479cc36bab0caeb7b0ff405ef8118cb7c</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<tags>
<tag> Shell </tag>
</tags>
</entry>
<entry>
<title>C++学习笔记#</title>
<link href="/posts/17151.html"/>
<url>/posts/17151.html</url>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="密码不对,再猜猜看哦" data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="e0f31a9470aa71a950392f357f3199b9cc1af7c06d00a41f8c38b82f2f41fc06">b73bd50429e4d350727cbeb8853cc6e0767e9e5da1659ca87b36b60e5c434f395db81b8fc0ca1d634da1630916707e89bcd353e58feb30caea2487048a0a6da0970898b7867e7f9c9f42568ba8f6a78e41bd8039e177588e707b9479e84e2ed0ac791478a9d4d9a9d2a4efe4e919876c12c9c0b3ba1e0a101a82d207707ba5b37cab3ff116e5741408015d2953b61cb19b5ebdc928e0e61ec401e2fb83f420e1ad58fe3321abae4bcd217cbf669965aed33b51638d6f4968b734b11286f9b0e379e89455a88942d63f0d1cb21b57cb50e06bd832e102e50b43603f47def64bae80a273d911fd9a4e7acc3517b77aa1c2988134bdb7573a46d19abb7d887f51a2a112a6039e8a71bfb4b9ef0c41f9e79984aeb386a43434a1aa07dc2e4d280de142a686af98305b38419918dcc17eebf34f85ae1aeafef7aecee13c2d4d58af4e11041fb19b01904825b8df3794e53cae982cfc67f30134de596743a63fb24ab904f87d08f78d9eaeb17d3ce9dd086d096791f986df67ff180694da124617c8d70e6b166c3a71a5cf10fcd9a459d1fae4fb408c756e12575a05d923d32c3f4b5f44b5733aff32faf5d78b67f9f2b8223584b7074d7ab758014c8bbd832d10ab71c308c1b62786394c0de9fd784414fcd589960b61c72bacf6493e178b654863cc8a6318f22061a2f16000699fb4a25bf7bc2d4351c3c5f012f927ee6c253c43f5c502e7929733e788a0249cd6a5d58fa4ccfa2b9e0674fe1ad1725546a262e502cb889319044a7b51288d3c0d07e2fdb37305920f8c7eec2ad445dfbc0d760387638cf33dc4e5f61bd6bbe82fbfd4d97a872eea864e176f3321bb0be329563172f8cd5e59054d54c104c0678a95202aaf1b63c086575bb40496111f67d5be9b7f480809c4fe3aef01bf777ece11ceec6681dc5844d74cc200c8566ef778e60134ecd33567c4f968058f3e21d8557e17f0fbef04730a07f69e655c787cdc478a53165fa79db0244ad6cb778112346d0571ca247e83eac102b88472eeef43c0000463fdedd243bb405b291954c7eb24336187bf95384a254bef1d35d6667f2b325155857f917a0c298c1c8116317c144d7fa9515bed4d90a79cee571b58c9873c4b64bd768cc90554b39ac948e4dbaecbde032133356e8b6fa84c0385bce8dcda207fd98fd493394a166c3ddfc9e236f2a1ae1260115da1d0eb5757e91e9b80d254ec394dc18fc4bc50a4f786d4be6cb4c14efe956dc5b6d0767be1ee65a2a85cca4da2dbf9f5a9d472d000a67b746b593ba4d20ad8a2a17b77e4d91188b2064e06dd5e5a12fd5a613abbfb5e6053e7fcbe3e34ea8e7cf0937d0fff01679c3ac57718e900e3c195bf7e72355a30818509403070bb7330e194ccf481abfb8b23bb472fd250adbff01384af20a27a973da651499ef5077310a0cc3792efc44416af00923e8f07bb67dec81adb3d638e1ce54acb5ae35d1edc4f5a580ccff533749d7cd3db1f415e69e8b2be15a3fc98b68864699a3ba7e3410ba61e369e1f4b85a11ed4b733564b521df418be8d01f0c08586d15558d0348d7714058a0121a18784eedad9458889ee8a890d965dfa94a8f1cc5d7ffe813424d106dbeed765670e73e93b83b356397d1a5808d95d96c2e13ac859f4b70f32123cc79810a84dff1e69bc24e0f8e7fd3ac61a6e8026f029f0e81b196eac8d5d80013d2364f6349b00022593317a73cba101b3fc91850c5cd46805f8cf6b0ad736adfd06a9aba6122a215410f0b0b0438af35405b628935f77e63a96630cce389112714ebd62668250140dffb6c385b501884e80f490250264929972e13ed3c58f06eef57277f3b84d49676b1d5d35799a637918d1a227aa882569cbefa2a983494855f8be9aeebb430a8228cb32ca14b9dc4896390db3e66cd33f22025d38236725e3aef2c844628d69694b17ddf40ca7b1de780562bbf5d86dc01dd4502ae7d2b0a19fdaa7dd313b6a9def232ab4ddb762fa3545645927febc87173a49f78e4ffc01603c89595dc52821ede510d189751e46db086d968e1e02101bd12b2aa7477c87afaaabe785bf6ca622b4d4159725b318cd48fa6a157fd1904ab3800bb123820395af71b64a4821e874ba22834828dda41e06fe263836a88c5c433dd51080921f969f3232411c3300d54f7404c1a3350330f4306210a3ded520cdd5037c7c52afcffe65db36f661743e7377dd738016cbf746a2ec2c88f5990b78c76dec12e11d10b04310a1fe258ae5e6980a3a050c456574064a4a6f4bb5f167174635c8bb942961cec7fcdc4f551d94cc2bafe70aadb169182b3a1f9d1297b51d58094c9f968922c321cbe18b4d035034fb8a313c558ce31146a4b6ca5fb7f287d43ad0993dd4f4c0f9308038b2a6e97625e1244e806b9a2ff972688e368467856cd0551428a51f64f7b448533795224e37e4f618c33243f2c1ec17b05ef45835fc97924141aadfd2247223acf9946c36706a0042f6275481f5f69be3b976bd60e59e67d6cde8238d405783fdfe7118a16a063d0244f32098e7670c516bd5550b6c3d6c7d188b362e71806d0a167e19e1e4d9dc785872faff8f4cec6998a657687b38d5f094ee97df5cb3ad380f2b72a0ebbd3b64398d1c560ca9bb28fbd8836d644e71c06f91b56e3e26643c00c8d7dfd3e18e8aa4bd518d3877656ce969d8597ead1351106411f560a43aa1f5cdecee66419e8c395c72221a1841b60534091deef531adf2a5119d5629039fcf13b3218b12f23034d312053f5c62f41abe76994ec7935dff8731ed6723646562105f379f42ad6f444c4a7ed048c1f34d7411c61b6f9c02347db3f87f4cdae8cae763388309cb7f81d1e418b5b6e064b364f238a9140792f3b56a5e021ae1ca5653ff7ecbfe798f9297f80bafb5477759c42f8ab5b3bc9cab71fc04b174c95a879804d7ab6ec553a812d72efde7e6ed1f884b88a8f6a2872b297271b2b3e6b16a10dc70648de64a0c923244f234994e7f06b485aea7497f407ba7850ab6921ae4cbc552927b1204233b32e0832d5e572891c5f0254e47daafd976f4af9dad122afc3fae3676d8f81e5fd7691aac481bafca3a2a9df29fe6691278073cc0d81dbbfb39586090cd464e65557905ee8ef592bee000ef129d35e90ba124ccee6ccb1241575244ba65bc4b48bbc62e449590e26fd7a6d54798fc7d856e339528f5eba25e73638fd5449e8ea56d331f0a5fc5c5bef2cafb199ef33930a007a4c5cae88f9fff41849369a84f5e15f58fdab9ff11b56fbfb2e7f7abc6d22aa2bbf8a9e4abfa05f6a7f5c7c4b06e0a2ceb4f2dc2cc5fe28db3d079aacb8f5461bd1c91104777f96dad659d82a599249bcf6d715009a22830e3f4511bb495530aaa7cb18873d4e36c64e09bf325185503b11f26037ba4666acd72ac43cdba2dc0184423419f1b6ff33017e2c6954de9e7d2898b7e97d867f5b0006be6d87c5975029a13933bac387c8e84c352c225ab4a6af9c27495acd20407c00b596acf8601651d9ba6de9244daa7810019e3c57edb2e628b44f00ce3015bdee8fdce3ea6b3c1d0f54afe96afc5cca7409e606b170f0b61cc422e3b92dfaf18951dbdbc047a7172c1db3f0a7d27273e5be2beb635fa66447007aedec9d0bf66f3d1360371d62d8b5100059ce71b5bbd3364a709d9ae47456b79d4f9f4cb075f6e87b53acb0949d20588e6890b8c0b3fa235e479d81006d2aacd6374f587bbc6344e824ea9402e008dd1d32cb3a43ca3574daa7f8be84fecb25c994fd1ecccd353f8297e99037c2aa7015522534f9113f81c3dc3272747add6831bf0ba7bed7470147e3ca7b877ff06dfa3e5ea27f1a510838134e883ddecca468bb5203fe4e54b2df4e799628969f3f98ececc2d79711f34bdfb83bbb765d22303b18a68310d92f6253658ec0d131b558b04c37d649bcba9b55c774994ebe8da7c657c8ae3a87dd40fbe41610635e51974d74ee4298eca7dc0e7a1a443ec9e7a49527f49219e98fdaacffe43cca17ef174bc15a0d3b89fcb3619961f85e5c2e110a40ad2e7d3da8a58a3d7962cefd9a4e69a86285a2c09361d49a47334315c580de076b14eb98f566b97f284c637ec60468235c453414b98de5edd1db168ab037aae3364cf303b9544d810631fa07a2fd0b09162f6fbf2ce588d40230b7f67de312b18b4edf09862e3e807355dda8ebd8f0a6db935e5e0b1b377dde60930f9d3690713580dfdced3cdf8d5ace94ec51c2a6b7ae658810076dc1fb6d78b417d07ce74925cf38274b3e31ac98411c9b291f4a3fa98c53a009a13638165427b9f739b9b8cd1ec32de09d18ac29ed374ea0cc96913c65cbd6c85cc64acec985efb109c3d280374307dfda7722a1cd4df359c6bd35b98993d0ad1a08604bfb28bf13f30794dca0ac394a99ce5366433411eeaf30ef1188eaf4732611b54fa7a43d557315affd0625cfa6d0f88378e1a03d36206103e482acdaca8ac555764f902e90b2ff1b5970d0fdd17d715f9b1e7f522e8f964f9ba51585af3ee6d1fc6245579b5133a3cbb6c6466f180f2f14970e632a460c50e4e764fb90467287b243008cc98fddf1ec26a8838b62406b6887992e6920a1ff258b46102d62c85ad02097e68034a2a01cc215b2b18a4152f8c7db71bcd1660055b134708cde13636c1f6a03c1b407aeb8d0d053eff1739e00e18592248981ce843ba8615506f0d88f1e3e2ab7c39f8489bff0c0c666f53e34ff3a55dbe16df733a29fce0a472ab84a046fd078e7d886b201f937c170abe701394b1df40b019d757666aa11b693cc97fa5406d40c96a24fef313f8ac6cb70399664dea0cc2a65301653c05219f8e586e3d0fbf39f31049bb83407a8e7658ff48ef439edfb3867a05af62b9f897be871a46e6629af2ff2c071d7fca12d0d1619367ee5d868d3cd46459440ad7aa0080912427edc1015aef3e2da3a8e15d0c795ed02aa024c65bdc44b6627dad9413f861a81bfc4a07734ad5f1fe33102076bd3571382e21bb431cd77ea71dc7b70061db1a3ea53eaaceed118c658fd3e29d65eac5f3b8d147fa894761f706f65873c1b0512623930da0e3b1011dd17618ea86daf490af0d5f6be6b357824623981cd88d3c1edb20ea1f7062c901cf740d976dddb21f3cc9448dc7d779595404d64fa71b7b88573cd5548409ed4c07ec7e74e4969836e1faa9df0ff6bf7f66e77d40a0b075cacf49c6d80ea7cfab5ce67c903939d216afd754078164b0f7a94d0b350fa34e5b6b2dfe69c3fb92edf8221f368aefcc140b1a88cb9c8abb6a3ffea184e77188e596084b151f70ffd7aa53fb7bc81ac8373ec367850ba99a050d9a3ac9f8155ee3ecee526d4f1add33dfc732b466d7b180f8f1b35882da884e5dc78b29da5d8fa2d2bdd7bddf15d1945baa176c15a00072b108858226fcb3a673203f58b850a0a0b93b0743488a02eeb680e3811f6e0c93052be24d444c8ad307d06646e12af10fb8af702a414180803c6c1af02f957caf258ac2130ad1a307ae9bb8723134d5f64ee9d591d8503e4ed52b94eb23fe26ce57b112df7fc9044d282ea450bbfb19c02019e514d180f4036e3bc83a6952f52b191719223af8389dba850047d8f473ee4dc6c8b9ccc5f5e41eafff235aacc0e6546b28aae7b57cfbf1fba1b9d890c6c9d36ab3d22880c5ec79588d87402dd294174f8d342b98498671b40a79c47757de299cc365b9cf7e8f4883973bc1603f2b058f09350fd0eca7957ef695b720f575779923f16bd88b8f58b96ae6755b014b4966fc6383e874302408969f233d970270e2939c82d198af3eab02233295ddd0e177f405c51a1de6bb139868b3b81d31da6495f1993721e32f7b235bdb06f25a4fce4beb4c22eece5d8fe2de09f88bdbef8eb48850847f3ec1c1c330a733a9de86b8dee9aac4caf2b6d5368371c2c7ff709f9467aa3f844b306c138133de5afacb405bfb8dd6525aba4e1a3269a862c39f79a1ee00c04d3993ff2fe11798fb5d346f895d2142dd8babd43df312105009bf102ded73d50da2bf9203be11925934abc0fb2c2a8d87bca65f33cd2250125a6ff1b70d29c8000bca48333c7d9646d25d46600b4d5c8ef2de432dffbc07cff885ecadce6c3f7851b0c031c9424fee8920938c5cdbcdf2c642e44a081e2c5f2e543a693eac0856b69dafbb0c134848aeeda759368645c407810d76e6294b92f155e5a4bafb266cc46489909d0592ea32748c3f09d1356d6316dc2b26f48e6f5266393613383e1abb9676a738606e62295156ec9630d5462488df787783def1bbb4d33898b20f649b27cca500be10a3f443d34d279aeb43a1dfea59dea1f338a8416f2bd01adba79cd451b75226c69ff3101fc8430e4374eabb06e4e5e8d74f87d0333858e97c745a3fff3e057e9d6fcae4fea93e81f72643275b5ba85bde93fec940dcb8d1c1a65dbfa0a64f6d36d2733933f0aca7a5f8be8af728159d548da92fb48a774da48e50e3b4853afc9cf1fdc63646e4ba3272d8d028dd19deed6d5bd6717b03a226852790c2117e0f5359a5e7b90992b9763e65ee3a4be36965def46e7619feff1b6b01074ef56e8af2a5203bf99ce11d8b60a98696f5a1c1551e75c74bef20267ff9e1b3eb8f38bcc05f4aaad4b3939d5387528e94f82b42eee6e7c4e72db2495c4aa6442b10d98b54c841d0aa548d7f7d8fd4614bd7e6a7cbec1b5c412909fdc76e884084ffdd6dc55568a85191c7a985cf41c9221e66bba0f864485d9a9906dae6358592c521bd71daf01294d318494cc2048ae077b4b8085bc62ab1172156f91cc6f2032265e70d28f2b1488037b2bfd02e5cefe3d9d29e22407742e30fbadaf9b23ffcab39ae4df8569d8ed5de2bd6a194b2a392d58963089bfecdc28227b019148605c2e079a7ce7e3961dc2a9de5de117765981e41ef614e898c70905ee6869a788c819ac5b050d556d6ca3a5cb53cb7cff9060aa00f506770e74aedf1d225351082c96c4ef578ae7942f54566b46b80d584f5882b8b65d7c47af9adc9559066bd2c6f31ac17018a7c95a362bb00f45ad3463ddcb45f8132def34669fb8cf7f1e15295e000e0e92239d1f2cd240eb3de33817bc48883dee2335948206fb1e5b93a6a0a6166d5519f094ce3f86dafb04b9f0d195e8f1509d23820090023d758fd3e37113a505f18a9af8be12da7c6b27ca2db9b1c4ebfa7969805ff12c9884d4cceefa6e6bb034e3b479526df71444194ad49de388c8f3fe9d669e228aa7ea44411745b10dac133f544a694db7deb63eb7881753be3e2a9020e43360599aa38a1a90173b4dc366e292031a0e42e993d8fa31901e836abeced17395081e91d18dd7c1598f019ea8090515458e083ad2b28a813e19a1feb017f378817940161a9cbd36a44e3731485998f8563033a0cbf8a858b89e137a52000c8d020a9d367e195e1ba84696f50654f07dbe6e792ef0f923550f7d805c9291a094b26165d68dea05c813139366fded3b7dd1febe93b20634880b7343498f525aa09ca38a5542776ecb9a0d21ee06cd8d9c4b138b3c6fcfdc6cce4b7415e8e66dfb937a558d21c26639c365aabcb07c83802f053e36a1e508a0f69d7733b8f545b205bba795ef60cf50de47270ff81ad828f56c1088d959778bdc18c177bb32fa8e5aa5e8abfae84e16f691c79f032bd11365bb57daf5fe0fffe889a40bfc0dc760e6932fa665d9f17e623c3ca2b08d5711489d733401c3af24190c7ab8a54142ec7d61baacb34f83947b0e0e43191a7ac82ef184761def0908237285d7c65388ff8b9c7ee918bf627e16b4cf05390be02d4638bcda97ffd88b1cce9286c03cf1f653fb1bd3b5861e0faea577ae5e09ca83a5f13567dc03eb226f44996f4902ce88a60612aaad0db09bedbe6a7f76cd16a234eb6e70c57e828c74d77835ed32e8289f975da5e58207f709891b94ce0e9fb1088f3858f42d30f9b233f7a2fce1c569efda4888b7516cf73e2562606c8957fcb1d29bc20827e3f8af79b8139d6dff076a8fe54c5c26311aec9a08b00ae2d8d7822e7c08b2ce8933e6eb8a21072ff37a8995166a278868df7865b71dcee984567e5769bf5a6a03638e78a9dfb315ca2ca81c8e204960ac856437e80734ae8465e6db21e606641424d93b003c2b4d71bf3d59e3cd2c7f1a90ae6a81bfea8ab28b1fd5e600af5677cfd88da94cd4c0e2f1632352998173205cf4954484cd19c50ac8c122afbbcc9bf322cc2cb5f2eec812af5b4fb403daa993dd16b7a0fcbbdd9c6b79c2487333de1dd7d82331453c05ab5c87ff5d70803293776eefcc0abe6d8b5d543c185cede0920ba4d0ff8bf80f78ea2102ccf522840ab9cdc675ecc1c42f6b9799fca0503719bfe3e7d360eaa21d00ed3679f423a7d49a8082033f79f9fc232f39bcbf0430848311167f1afa5930be9c4b565efceed32f0ca2a3af730305245428386eb7e36501a2120c640319f771f186f50aec7a09c416a288e3b5c6e2ca4572de3aeca3a232f8846e787f02668c8d93b8d0a239ddeae65d81c53ab2fe4d229510b67b63e5f0fa4da915b715ee3b1c9afbd3d9adb568197aedb2bebd886b40aff91524db1f9a486458de3591f59caafbb690b31c57b18b1fadd9661e1776c3c8351a251dd73edf2c4fb516f22d253d5a5af6876a6c8d9c962824d70b49f86a56f2abafd4ecb3777a1f68b5b7c03cee817808112bb58568cb598c1358951eea44266062b555a3f93cdaa30652a9b0159f0ff68141e943413d1de111ba791bfa0a00285129db3fa908d72928ba6e2fbbe1654457a714d942409248ae30b43fe21e75fb3086efebc10ae994e5a87128cecb011e806c49414dd50e8c080324955c7f5ee590310491a1d48151abeff3ef1bf40c8158f95d863128bbd8597685251c475f024477934b247ba7d3c495fbf0b99fc009b32dae1ff5f1a30563176e507e966fa12ee5ca37373aa172885489078e783677ca40d9e492f26a91d1b2e2febbec4bde50c4b9198d99eb7501b6e6ab6d98929cdd729d67a0dcff993759acdc0da448c7cc2c6f4a6c078d26d2863bf3b6c8ac2cf4d0dc18763cad9c5b3f1926a80ef3f4d2131c35940a26d0528ef6a12b80516735bda2f86a17cdcf75a808e11c1bde8c5349ba92953e61d5f5bb4f7204d773a1e56e9c21bfd1c247a8272dead99d4f6460b674af025a0965482e865dd53449f23795fb2b0578c9cd5b3388671c443efba67375995ade1126de6f783d6bb11b3835f397d96a2f52dc08048d2a5a3a1a8bfd8a45e0ae6476410e1e7dbc673120c7cd9fc8156808bbf26f49089891192d97c0562c8f1968e43a2739b33d1876981ee583919eec7a401f8a862e3eda648fed1a30a94d0e44aa2710aab98f405e4e265130e1c1bb51b15f81b59bfb2f8d592f3e8ffb78b35346e9ddaa1d1aaf1b1c43603733c427be15964dc82f298442eeb8339523caba143987f81918124c822970ea82d7b8f647ed57d5d90571d9b74752187daffbf44b24de7cd94a09abcd7cef81b7f717a5cbb21d224b3138d1117fe9d7fc322174dad66e2f4ec21f6788e2b33a8b0db6d5601bc0e909be2142b55c163b0c66eb90361eeefd9e1c9d2cc4cc9a54599f83b8aa7b96de740320954c8258d2736cc33706da26691e7bc655209b2a0639878916fb912bcf4b044b06f21d41a7f5888502d4e0736e9e29443f3bdf1411ad1f5fa61d2567bf340b4df8c1c47df58f19401fcef19614266ba4d3d17dbf4fef9d64bcf81e5f5ac0a1d913b18ec6aea8088fc78e7af02ba7a03aed413c54ca1ec3105a995ffab260412688009d2e7fb2794536c9adc5344dbd6e0638552152862ae7393d6bcc06e67d2b8c5147bf5eb30d7c453af3bfa5ef582f344520707bd035fa338827859a09c37638d23132f198efd93972028be64c7675b07028b4e9435fb5112f8e047673086a682bf4e00416468e58a89f17a3e16ba2b8a110c6d0b7540b82dd6668208fa65a345de1c555b6f8cf376666a8b0bd840ce391813de2038da83920316a9fadd3652a6f9f7c08932989e4779b35e8736a547aea08a112818eabe1fae9ddc7b95ef9b598178449a529d515639eaeb47353a07dc12ab56ba2bc3dc7430dc1a2fc988cdef91841d82d2932f098b2a8871f4f91853a1d25cbb15e11536ba57c2980abd7377bc7a9ad5c0ebf46448fbb937fd8d6279b968de84289267e2619c70d0452919041b921b2b255ba3bea6e13d0770b57e6cb40b25a7e92a39b27b770ff8623f26af0b314c15e0f8a7d65b6e57f063a317e7568f777664b1960638616d2f15cebce78c35c440fb51b57a14d320829a9563d12d8f644fb1959681cf067b7235a66c0311c3cc96c5964d133cc7578b85d293a00dd2d41896a9a77010e2e5329589e066819752e93dbe627b39ca1c6a52f4227d2e3bbe46aadc92d74c5c1810ae9f8812972db6c57b7c4f77b2d7349dc2ca351a7d1fd4bd5f19e28bda61db224b56dc6bb7c0fe06cb9510776940ab07f0500b7828d7ec346c121ad3adb1d01f5330ed20d135d6de0a315df3aacf685d696b021f2d98f3baf9d33e49333a032afa847b5eb2c67fbbfdb25ce4db75d7599cd403ee2cf820e7ccd487acc1b5cb73f549f8634a496d151a83d569e7beb39aa6404790260844fa95fff64f97d9b16ebc53a0bce199dbeaa622058c9808e9dcda3fdc34f3674dd23864a32d931b255945f191282a20772485f616db31ab447bdfe298e3043be307d33b136d1ea9c97693b83de4a4efabe196f2ac56c76e3187a3eb20333d2eb70261615dc1018763c0ba3a001497b494987ca4abe466431c10784b2281712083935f7984abae2feb630fb57a9357a91b2f351ae3a703bf38d39dd29ee940d489196f2cebec9146776e1303b135b3a8999787614c4c0758a44068e4223d3cbb365e0e88d6fffa10f511929f2b54cd39e531f7973c79255eabccb747270503a4b6e552931e6396b6115b12ca6b9d7d6d83dab5347431eea9aca8f2bd957e9bfa7c26e959a0f37f5ae36d45ad4bdcd9400e43048fab5eb62ee5cc5c6accbd804ffa6af4fbb3e723113d99bd43bfb3e8b9fb5916d85f9373c10f7952730b288aa48691f165546ca7dba7b32a65d32622d14ee8dff638359888e864d886d872331ff8007d311a6430aa704ee44005be3843ce16aed91d7b8906bc26366276467dd9c698ec71ba4227f3da5251068f8963e892482e01409614fe343de90ebb57ec7eba00abfa5a1e4e8d950876899a6ef9f357c4e7550ce5f5d378220df6b2d4fb1676fa3e170b32e5c2c0ecda14a613b3625dbfd914f9c39f7f46e0a28cb063ebc844a42a05877a0e9e24ddd5a720ed764e95fd278ad3c02b2edc59a9a1ecc9e57b4d0e5f42191629b06a1b2d4eecdcba3965ba36682b6b5b4d1d0fb3fcf41266879b6e968f32576d23039bbd3235e26d1c50a95227c9bfe8eb0c395ccf66b9d9fff058331277840c1fdcb10e2234083f113607433412c3e2ed92a6ed8746fa41e8a79a64753a6195b082178b57c41448d3806b7a95e9bd1ee918e3ed3ff2faeecb77ab54ec980aef83417ba2b0abec6dddca7ccf344cc1412c520c5b945f76c1bc6123f8584727587495c3118ca5fbd9ee52e2e5055cf8639295c5b2c58481d7d0a11ee2f06412eb1e136a99a23af8d037754641b6ce2780dc28ec214a36375c47d55e525cbb6cd5e80df652e4846457cdfec80b3562751ce9f82589a7108391162336909b10ba30bba7749cf3e5b218829965e5783349b84c3155ea27e9392607f256aa920be7b183fbc59f631ecc742e2ad6bd9914ba4f06c807a175fc5f1cd341b8fbcea2037b8e0708bf517f688e91b958b7686dbf6ad68fcf22b2627b28b07fafceb02fdfc5d4c59a93444e2a2ef44ee3af64f8eb3f6255bb3a3aadf4ef25e34730816bd3c31485d60e3dfaa743d6e10ef925a17fc81fa497f3e2f01d12723bb4fbf55c0a39ce98d829c0fa0afb2886e088955d3db136dc8640ca866714a74ca9d0eb5bdf2596b09baa22b4ff6a5fae05856df885ce4c4bf442f3acf404665154dee0c29bc056e897425628292cf445571a2be86ffa6047ec3800709afcf44274ed5950f62a347f02cbb65e66d184b7d87de1d99395d73d3d2e360aadde36ea2956a35d15cf08a9e50375c1a192ba458352bcca04f75c274297b67c41e67b669e2e5b789a3f653c5d01963919c90daaf8f7d78bea62867bdba811066c547878bf6b68b1031d0602df1039aa17e81ce372db0b3749c4d93de525a06c4b6c98fd51431ec6ba6258e1d29e2de94265191d3e816e360a0502123011817518bddb0266f4568a7cb918ef6a49e500e444d4c622a97f6f26f96075de1dd2bd372da288fb621574749a1ba194f08c340f7c1d43d9088c2f6d43b51861d060406df99290d376bc42f39540bfcfffc31713468ba90711951ac5385ff705dbdbc171299dd622ddd7147155f19005a8a27e7816af150cb02ce6e06e92b4a1aff298df1ecdb6a4ce0604e1591e7b7b174d64c4651eef2d25f24c01e743e245a5db977ceec151bb49ad4870ca6e73627b63383b2a7815a259f2dd07914c599e1bb1aea301783dabca330bef919c6250993ca3fa87899993aa8939a8ba8498eeead57e26d9a04e1fb2d862ecc0d4fabec993adfd878284f1ebf3489e3353bf0de9b5f34cfc2266054c66f7efed1373bedd94ca0193a7056ffc42316bc5f3dbf4820f2265d7b5baf8e96442760fd4fb61dd1618bdb1e38bd04532a7d236cb333bb4377bd39e9a008485b146e7e907e69ead1cd27b10ef2d0b32e18527e1188c9afe15cecdf8b2cfbd1729b2de60eebb6f44ee4ac228c5a7c61dcec632f40bb794e99e81bdb7e797a9c897d4330de2394e6cf4ae025a982c38bbd02675672156fa91152a0b9e3bfcb555a1a59dc29ba46361d099e6a59b4b957ffbdec5c92517fc9b5e5bb7eb78130a552165439c0ef4053faacff72dffdebc65f8348a891a720601372498592a5a9e89f991703a0641eea8fa681dbf70041760602524519ed9bca021533d34be7105065d01881a84c41005a2dfeaff93598235ec5a59ecabc65318011e6c46bc5ac51022b7d0f8fa49a041a90c0e36f19e5aec72c50ae31f89ec2e3122f42c27288170448399423ad5374006670bf9f60fc090ec64ab823f27adf52ff7182be57c0128d8253277bd1aafa2b9abb7bba617c0e5e8ab068f199594e37fad5be8032f5a93f5b11bf070a485354a44409cfdbf645652e9e5b2f07759b076d5d10be079f4ab55ac667e45270c8524043e9c64901569b3849ab728b3cf35c4c8c37b1be230580f7bd7f46d7c58664ce0a38d84c5b4cb474be4e6fd9d6ed936ce04dcb0801183ca81bb99dea281cbc1f0aa165a570c677681e1081ccc264a148063016d6909fe4632fe9bd2ed3f75cefa5f4b12d8c7d0a5409814be571f45061003911eb807b67910414755c6ee3e289fcf00c892baa9ca5ac9cb084d28dc41a54450e258526d568503e75a4f496ab3e5a8f382a3f9a81bb180284de87314d3880711cf31439c969e9b8c62c12b96ae9bc708085458a8e95933aa5aa8e148b5f26d4718390c2abd1c770c0678b3aea80b81ce75bc82535d6e4f2cfd9696dd8859e6415fde0bee1d6aea07033e8126526c813a57a1e4b12e4e291291ea3455c0d74069360f575e3f95e579c6f3a96bfd283e2b03d48bc74af1ab8b72e96b23efa1dd98d5efeb3e683876a20462e39534c28c9fc92bea84e38e0ea21206df210590399b45fe2dd8d4a69ec0986a57a1345caac071157ef830bb66ae7caf4f4ad234fbc9e4419caf942dc8216ae9e538e82634139ada3a73ef18d3afac31e74103ab5598ee941e7022ea9cdec6ad55a978820cadcf863bd699fb1ccabf235aca536af77c27f2734da69d0bbb78e03630ac6b6813943e6a7df51d4c87e853d2a39fb942a3b3e9afd93f7c258de202e497f07c61d8c51393c35e500ea48285c7584b877c88d5bc6b13548d32d9726cf5325c95d176da34e50099d6d611c452722889dde25941cd6bdb3c2fc4293c81f61dbfc5465ae3d0d08afd107950a2a2b141f5895e6ab11f52df198977191a676407b6e718bde72379b64ec6947819fd97d876617d8a21d0ba539205b8bb8d4cb8cebd526358df1fb6234738d7dc16ccd5cfce380946d7e58744054254146be7ec16f271fb7e43e6001b20846e4b25a778bac86e9e579e5e396e67ce7d3ffdb9072e7c9880824b424a8b59f2885cbeac9b750f5741ea31f5080e6fa50dae63b4d3241fcf3576a6541b6190936bba6ea4083963b911c335e844ed7755b2fa419e6647b403e7003abb1d009dbfd14843a71e15050d14716cdbca79c1558087a7a536fdbd480abf6ac9cb9d4ffdc8fe0b1229978492b72c0b97a62b3173f7b81b26febcd917fc4bdcab36d6d47842a04d18ed9ffa026e3fab2a273f8bc7ed3f921c2319a474b242186dd54ff88d4a4370bc45d9f887bff2937fae34a6979e5b46edd45350139f3a7a27a064aa06adddc67840f6ecf3b9b7b4b9f6c365c8108d3f8e5e18b53580a93d1c5d7a99993ad2a7f5834ad0866d373943e36455d59823d4f6b45740139cd88a6c233872a4e753a348570bef8dca60c1bf4e65d3deef70e61a900be3f66298984e434a11843d77efe3ba52d4950f81cba487eea121682a44b506cbb59f7b2ecf51575e35f0cc06a736a88e9f904662e005de1e53d4838269f04ada7d34f93749508a4c71adbb02c7af5163b4ce36c0816373a83c565c81c26e4f72971433b17ee6fb3547ec8d7ee715b89e638c5db01171d88f544b81865e781c58457019d09978ccf78cf74ba011af158bad7f6e2b41b1e957fd3d9e2076f0df813e52f08edd127a6be5db5322452bf7a6d887dfb8bd2db3a5b7c424b43b4632140c6acb51b4402b9729c2b8229c6f40714a9b769907307ddc90b2c19f750c34d4ebee42f8d9a3dce7234632a817382105237e31975d9c3b57a61b8c4fea133f1885304ed75ddcc1b0447a7b5ad6d9a42fa820f8e9ec50eb53be694e48cdd3bfbf6118ccfb7ee4c89d1893b31707370cd1ef11bfdd5436ee903856b17e59e1028de860b37a9b0db00b796f1bf46140d4434efccb03a322f52d979e18eef2909ba49d16981d264e0e683196a740bd6105e4b518e0890913a379b6bea1048241fddc5b464539f7a578e58030110d92c91563b92ec53662a04306918d27db8fb8f35c91da8e831e27bd4fd3ff279098cd5131fbe8317ae0fc2522b0a6e56f1d708d7649c52df6867970fbee832186acc5c89fad8ee3a4b0efdcb52763b3562c425354c72405bda6580bb4bed9caf6d12d9ccbab75619f886aece389d9f7a7bf4f19dfa0ef4a38daf8e7939fe42f27eab9c002c4d68fbf321fc50952fab26033a0d2175d6d64b814943ef7576aac131c8333b882d11699b06455d4a178db6f8c8fdef07ef7bb7c80267ef55893c31031410d899471b67a3ea0c3c3d048fd7f7389ce25a2b10f919ebc5409aeee540d74f1770fe783c916eb75503a62bfe31ebd3489530bee0c4812d9697054c0520a497fcda58330f1fdeb550a3273d51026c53a55d66ae5b7dc79723d3766680ed63ece1239eb3c22da16cb4592043d51f577f559adef2e0b29cdfff4a80c74dfa74a26147d26fe1a58bfe6ffe99e68d33e1156b64c9117874c7b68c03068bb2c1702098f10aab9cf254b03635a19f23e0fd9cac97ea132472efb8314491966940ead60d9edeecb725d15a56e8e0eb74b20f475249e5a305a92021e706078a559f947e3fe4c03e77a507d0b17c90b861e0a232fcc48e8c3c1bd7f1ee5aa293c7301103111444e6d6f9088beb979d6589e2bcb50de6e72cc9cf0355a3be3792c6dba980e752afc0775e51744d0a7e3c19c793c5368d6169184ce43d85eb15cca439adc238109be3fbcba9a90c006157226f9a61bcca3adfa</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<tags>
<tag> C++ </tag>
</tags>
</entry>
<entry>
<title>概率论笔记</title>
<link href="/posts/26124.html"/>
<url>/posts/26124.html</url>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="密码不对,再猜猜看哦" data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="53ad90fc142169c5af92e77e69738e8806c26f0fb67e1cc4c8336d013a3923ee">b73bd50429e4d350727cbeb8853cc6e0767e9e5da1659ca87b36b60e5c434f396eacc854be8989c48207028ce44b35d46a62358edfb80a65e4074b197c620d38f4da34cb95d5934d2769f5042f9ad21c261b8ab551f31b1d9477707f442e9b1fdffdd31e1af0cf7488e15efb61e9b610cf34a626ba86f7effdbc59fb753b5cd377785af12951905dbfa22c1ccf6bf8b36c186fe3f95b2278de620b81e769f88b5df2578766760cc6980d71bce010c4b61d6965b1b3b0e285eb71785383053904b3deddee91dea282375fee0c307dae907c341148f87235e4c95ddbfa14568e2dc9392c213d3fd215b435a6cbe995e347050563f549280d45110d42d79a381f870d680279ba826752f8766482cc236cf42069830ec050191c0fbcb76386ff0e5f64e9093772bd80d43d9eb4c8ee2144f5162c44989dc18d05f11e494500b885114b52b36a1d6554b490508b63b915b2cf0f2c54cf2075ece7d063447ff3272580ac2c5b9038d7bdef10b246af3827b9c0e3aa3830e106ef0da87213eb7407c7c8a784d6dd582e807510cc2dccc0dbca4f825db50c1fbf84e96b7a290629377545f2fbfedd8149a86b1ed1c14e906b1badd45a0ec5f9db4de6d86c87c179225515f1853ea719bc35cdade6ebeab4ca10d93198b7d4203dc8e76bab520161b418adf2181aa84b0e972fed51b2f2ad082ea647134f7836e3ca8aa5049cb830dede13cea8f6c0ae95f7800f911009c2362bd0de2fd9f8e8c2d864302b09626f201db29587f6b378df770a808518f2ab00f12e732816be4a7871dd203bea5ac5e1b7ebed4a2d310306ee3c6fa1e5b72a8ae43dbec6a68bf1b99b4fbcf2092f4a599a5fa1b85deca069f12bb6b254f10b1c99a1e7beb9fe7fe43de2a47923f86cf796dbe7f4c6abac49f2cb9ed452579098c43d2a5b2b7d544e1c05034ddf577204c76da6dc4ebba24dfa16f8be5450972b870c029e3129aab911407ffa219e9f017dbe7ed0e011efdb0412a397ed4aaf772b12f9b7edba6c0a1cce09f6f8f6db5d55c1a3de6cecc2dfaf28a9088768b194160f77cce3570cf50988dbd77ec5f414a89d71f8bb39c8ec352b973647f878aba56c8589a2391cb75d4a892f76841dec9ca27fbf91ae23765d6b77cd39a655e4a3b7518ff1cd8bec90c19c11a6fd4aff7e1adef8905892332aa7a9760b535790e2d56f33e42a91b63598c59af50b43c537bc611154921e00d88425eee377a100ab9dcece7d2d1749a709c893ca0823dff68d22bd6b3d12cad32bb136c56946238176e14cfc7a4325816a3b0aaabd6bb97837499cb7d0107f63d4c44e2dd8240726da29f951585975fb56720f37a9d8fa60491c5c5dc9c22ac1caceb7e49414d99b663a52f8e7ad5df3828b3ab00a3e4128461bc83de42e42d711acb333158b5a2bafdf6f0f2db2443eeaeb0f2584c5b735b6fda30e7fe7483fa47bf3aee5464ef0b8cdce47bcb273f3b8e25f4ba16749fe43d504d7356f7b4eaca688fc5dbf54483f5688a445f4c6c027227f660e19fc845c49c9670ff9b2a792ab34676193947a4aedda0cd4b8128c1da3bdd14048685afa54efd4a1968faeb10d280706516ebc022cef908759f8c03db837306286fa69dcc16f4cb4b688b64ff9b8d491c497a7f778e857d6ea935729e66a220edf4ec609192aded4bc78d5dd4be47e2f99c51a95dfaa7cabbd9839d697d3dde0e753a595a1e49c2ac53e7ded8845d27d96d0ea651d46c28eac1f3088cca8e9833ef00172a9e1656a87bc6e5865aebc3618e86170875813b61379b9153dfc5d12a5dbe1af43680e7bae90489d0021650f405d1c7d048c5c3ed1d088bf26ef9a59fa0ae2a175e24237c25de23afec87b06eb5611dcf8bf909f14ff3a31bf44d564d2cf4b812fd22d84cb890df314b3d56b4c1b1276f8978db02f540ad3ffc1237dd4410c36a3fbf8f0fd2b1a0fc60e11467123626c3f55c8137ef008b9963fc16cb356127bce7b7d1e77bb7a9cd76dafae0bee50a80ac84f0ea3f01dbd72c5a6a5785ee2ee206684a330cb91bc37e5c07f44c74f72111e24f22b7ad6ede4aea65766723f75b95d9b81e100e93446186b1e90c67db1be9520068bab5a9526b0a9de055f81b7cbaafcd151bc2bdbc2255de54eac6ad5a99854896c362e1d3dcb0a21b9f42d1736ada03c3ec6e2383bbd9de9e88bb1de05ae17ef296f51fd11d96e8c6ed0609195b65c591ce8557e2a20c77404cafc4e66cbbe17b4a161e55e1f7c78b6ee769effda67e7c178e9560b3cd1a8a41a094a6d041d361474e3c4a116ae83574cd585488359df0e5158d69539c7d055d6c5e948ac446898b5cf23c588138301e3368101258a851370ec006e279883168d4ecfddb62126b859c3c84a087f2a9c9e57d3bef2a29ea66f609b85650f48a3c2e7c4845af7a21a1832d0beced0cb4e5162038838239c5cb38dbb0804f77845b30c2ef4de204307c373b84ce6ee5557c8714fe492ce71501a1c695cbb0e6e1ce21806815c871930fb0f928094aba3ddb775399027915ae316a840889d3c30c2775a4cf5f70a7240e63f0267fc6589f0ba2e6597025a1de466b01d37e5a29cbdd7fb58a8083f68ff03b307b177e6e72abcc134bca8d33fac7d8fa8f34c962b4b1f491fe656a7b9ac86d882e27d12f2d2da740bfd8434e624c7f93c9027ed04d3995fbf0d69c68761231a6d9e0d454e6c7e62225740dc7806b2d887bdc60bf28999654fd0d8a4058fe84d0b4241b07f90281e5ac9d107f091039a0a5023cc46f60251521347da90a627c02a3082c7631032b1f30691e0ced2a93b2f57742b1e24a3f69662b41f5f3810e4fce60946f28c6d240800f73e6ad41e67ac37685090d6a25e09efa0b98715c9171a1293910499438547bd09891327632f4be82eae8836b34d0f6cbee867859db7bbf5140edee617188ad64fc529491ce84748beda5b5e7d9c8b558b4770ff147e2f3ad2c162b997132f1b1127f776660d6adb54b9940d21838530156b7e18258b28af874c994f95f9ddf03347d7270c824f64474028bf78107b0144f2bd6bdf7452f1d5f932f546ae6acdeb74203226fa4699ba1aec1e104820baba7ac6d83cab624637e6489aede44042a44ee8827fe2601fa58664acd92a229cefb3c5d1a545fe3c1b49606eb3bebde819793b31fbbcb5dca8c3609a3eb57ef0331ebfa44773259c325d08e1ceade8f4514404e7042ecf1dbf0c31274e97f90783b7f53bf17cf86f2a03e3821c70c7069c7f100018510ced4f4d2b86c8ae2772dcb4cdfcc3805c636309c32b130e506df50b51a2366f58674f377eedcf20de4889160d1ddc0dea8c0fbb416de031296179d5a98c4c5f52b16b95a6620278461e26dc90645b9bdced068c9c2d6b01337edf2c9f35e4812ee739291e2af99bb3e79ff310627829ece95f336eef8deb7aa66c961de113284d8207900106be021f43919cde5995646b8565588a74b2a4ec32f3f18bed6c30f207a9457c9e109f2adfa3fc32f30fc25f22c538f920fda76a42687a38b418bfbc27822f6ca5f1756a8caaf6491011de9aa602326438390ea5936183da1b56df9114d1328ed9ddfb7ca435e8804e1c19140758c1c49b4bb5ab8f46d8bb6c220567248f83a996f425723afb2808034c18b59a31530f82dab35138add1eea84b7ffb6a4f95f3c86380e31c28f5b153316251675d0ad16af2374d1d40c3e1af261ea716983a585fd2a1c431651ff0ef323bcbeb37fe096ee53a6cc57cec40c641b4b46ff49bbfdc922b2afba52c28bc0f7f462847accad8c9e2aceb12e3474fe6c90ae6b5eb4f33121a6546eaaef2d9d48e95f2bf8ceb3453e3a20cc38e678fe4d2fde23a4c0d4b34fa050ab0dc893ef04a6d7080b0faaff508d6abee17f6aa9650707c3c5bd5c7ce18702e8d67e1d2e3a3a720812de22195cbb820fada7ef28dcd2c5f098a4728df8c272b55cba8b3bc2ffec71837802c6b16c7de04e04a3329998f73ee273a4169cc77d5310a09adc9ac276b22a18773de9ffbaed656e933a9e1ad4846440da6ea23ae18e05b907694f9943637a396ebe1338408503aca3db971f4da9038fc8a5e960d28770fd0d26807dbda431c1840a548f29890f72e9ddc18b47fdc5576c45a8d5adadfe8aeaae582c3974b28961c3bdf9f8af3675745805577c6147263cfda6ba1873db8301da3c017a8bf6e4f670b47ee189822f0c2fdae479dada4c9a00de40e25a6a99294f1125d715ca14a3e9d1bfaddc1300a9ac8fac595fed4534e66a226e6d209632c1d7d28800336ea84bb95b21a97037a10ea01944929168e8b361791bd29c16436061452dede7a9ace0ce4a8cf2a917eacf2f28c3d95fb37f3170020af6b75d7df04bd3f7ab100b812ed930c52d610f73386fa35f97f02205228fbba47db1a44340c99fb3cc477aed95da3ddb75c9e82d7188792062c48e252c588713132a34b8c2a9222638ad49d42f75bf735cce992567d34ee7f69734f322c8a6c6261cc59f2587b3725f2fb4135db965e72333d48e81a8b32e2ce5188b390d55312b2cb08f3181857f7931fe10ead49e18d5d740bc4a538c7c1aa053c051a8d87c9c16eac0caee8d041df0ec9bbcc56e7a9dcd9767665e40618ce1f172ef2d921801faa8b8da9ab8642992a24198a4356ae362405061731ac6aca1df646d81024d09950c85493633e7103f79e2961c59fa49001c7ab9e47f6e55fc4ae7241e22fe13da9c0b3dc755f298e049ac8259f636364e3a6d1077c580e9cc26181c466e1eec09fa82ae20e048db912b807e93048c4fc9c63796cd1e42cf94bf3da036dcbe24a8fba72af503b40caf5d9e3015876658f32806bb31dd4eff4191f6ee7d5cfdb04d3de36b5120779702493ff4d4d2ec51f9d4e26b1b59d775f249409ed472fc74a6f24c4ba91b348b00b5d632d8c15b8a30d2937d1ea7b2ce26046bcb7c0421d63283fa038ec08f761cd955d8f6ef4a9fa79aa22cbba0dfd38880cb9b0ad12a395fd026670fae1c684a4e5a280ff89528596d841ca067564e26165cdacebd0cfc43f0f4f7023b4fc916764fed3119ec441b581e8fb25c74cf08d85d33c175e0cc9088370b6ece5fbb6a8fd643137dfb493e127770e2a565ce7f038db0dd6536e08528ae955db04c6a49734b6c46ca349302f267ad9e5d4c5ce96ea58060d86f5a588f68d3535a840df71291a6dbbcd8348e690803a9305a080120132658e0727f0d1a01cf54f4d96970bdee235fcb6ea5f8f13920ef98fdba909cb8bfd79f1f50cd1ef806128890d1f5948cf54a9adcfe72d2c14ee90aadb93f8febd442226c209c5df6f3d4cccdb8221219d4cb989f185ef5c8176d0d593ba12c3fa13c4201e597f65bfe4ebc2d04ad534bb781d3636d72849d0855805f63d1f8a37e905ba0cda033228f1b9ba903bf6fa0ea137d9dffc21a0988bff7957fa4ee97a98fedc29fc00be8c090b565ade834c08553ebcb08abd746ab835db5aaaf2430231234b3b6dc9dc8f64eecba22a48b6a4b21c032df2480d50236669fb4f3bc0bf8c4d644b23f3af079127f59c9187b3099c378e2704d91aa1735bc3c46f40fcb5b2cdfb91646cb90aa866792e4d5083fa6c05c703a256707de0833c0e87ad441db3b66cbfac547897d3462fd27a026474ccd725868781caec3161910a9baae06e444e3356b7457574583c22bd69c790d745ae53208eb3774209c9fb55cd21b85dc2eeb174518c2d5f67104070fd93c6d07efa1929ba90d4480de1115a23c1b4e5f3567f39f0e516d2c637a2196c3f7ba1007bb1044ddacad290afa27182b3d9aa257533e802944203e83426f54b58c42feb09e9015603cd2aa6f0cf7b0d67ffb510aa71f7a4fce94d488761c793ad950120a7b14705477fb4773f7b12fc4958e5e9788139e59631fb51c27ee055184e582ebfbd2a15bb95d93342388b149b0705617300c0688d5c10fd373fc8368721d752a56071880dbdfc4f12811eadc1606b3de488a47ba6f5e7f1d966b5212a756a57ccfd13370fc0f2720cd08200a845563b2eae3d9e4d9ec36ca6059bf2e7f8f80e1532862edca8a0d3726009d0b2d315b73adca084cf5d4a7c309e01f5557baa30866166cee472ee619a775a36317a743e624259f5fd8d982cbe427255834019dba87725ab05cebfbaa5c004004dca1fcb36c478dfa76ed61ce22bc261fcb05de2aad52e783b3ced47636d64951ee0facb9607a5b7af657822664eb0f99db0cfb3d39ed9bd1edc8d4576a98008261c0ea60abbce4204051d1ab2c799ecaecc0ba90dd502a22ac2eeb7d3b747cf23acd84271c27bdea9b16a4261c8efcc2c519be35376ae3322e7e1f1a9491083b23b24238f59468346c06a915d9192c839cdbf8ff019785c73a114017120efc415aa983d4a30ea02d505c3d25d6007114570abc725ad0bab3c83c800f164d27d223d56c77066e46b8c6e8b1c65bfde0f792a321807c8fce214e24a958d8246b1a72e72458ed1c5efedb911f55b5864ff8229ddd5cc88f11ea78deee96cee5a61d8d677101a0053c3334cb3654c9fa5fcb5812f4cf1c4bac5e9ac5a1de78f8a671e52276c2ff6d6f310dff07f5ba5815c12f1527189baa1ed1409d9dc0bdcddff7f26e7b4da1467ac78b06a709571a4800af2fc018128c71b18d473dc779ccc9f326a34f1e646cdf9842ed9a1afc77aa60e71ef0ae0635674a3007949ec7d85e3264e1c4122bf9ae2248b7313a115c398e52c4bff690355ccde63439ee584cb4f0f3472ed29ee164af767374576ed3ee4daf70c5c8be6719c0623ab4769473720c98ab275646d70a08463d8fd27131b23182950540e02e0389b1170fa76839f5bb34aeb2f995bc6b8ac2db0ef6819054b3aa4474bb46171b0821f36b3c3deb28a269a502e23037dd8672529077abed2025f2c9a16f6e258f2e152dc9f7ad2ea81b390efa5e6d2d1cb674e4e7ecc8dd0b39cae294e563b249437d6f0af65e50150f00e0d47e250db5a57a75d534c7dc7d069be6652b5f149314d76b07bbb1bca161de32ff0b26eec5b6665d8c7eda55c772854e199bb885c1af332f61abbbe97612a88e01c30347abe68effe9309d2a341f3a87d899e805549b62b7ff7a56e3af22c564bbbfa1f26667752a5825fb6081cb19953e32f0f5ae5d9771bd33910430ba9681497112503ef93dd25ce46060ef67686a25ce7746dfa04c24aeb6b1ff92f5f4fc31edd9df21473a4fa529273decf8b0a8d9cc6e5a4eb5d1fe56817dead7261bb3c51035efcce0f073f72a1e6b17406793d92148fff42078b74bcabcc61a321b2b1de6b54482279543dfb3d8bd46cb77f9ca6558231b5fd73c4ad42e9cf2b7937ae6b2be43830ba9a3e40050c6f3fecaf7959c4258da413c993f743c7640da787103774c73a6cdff768042f678e03a3894a5377309c68d6b7fca9ac27262c4f56d2a5a2a1d51b2ea32a4b1c8d53262f4a6d93a57dcc5d184902f6d114d181e1db548077ef5fbf4159f23c908b7d9018bf95cf70079c4346ab8d6e96ea7b9083557b30d92e760ab05776c6a21326e506d3d7560bb1dc09a155373080a42e04a2dbbf2712d1c458b63fb1208a975917b1073b19b60be63526d2a149a966edf2341d269da22c39db68c0c608c4031519d0ed5f6622853987d052db5a74feb87c613e0f3a2bac5dc431e771c99067ba45ab038c332a21eb8c16f24681045dd12289ec91a70afca37c95e0a94a20a03cca83546a59440d9bb4f82385d02b25be96240c5f179748120b78f9ef19eb2966d037851109ccfa2e35467f6cbe4c4a6d667f6edac93caf7ef7cc55efcc4d5feb406aa3de297c6bb03d8877c8fc2c91c239f0ee6f975857fca744c36dfd0d1dec71af31570d5a4b78db2a98e5e1ce281c6ec2cdea7f900b272579d7bc0d86b9ca37ea371616012c792cb85209a7a8406cdf08f574816d89c5675339195ad68d72ec4bd8dc394143800d9a942bd38ee8478f9438cc1b1211e74cb7440ef8836078a7d9fbbb068025cbf13ed22674b64beabd8238ceb7e490863dbe443b71e6042e7f73f46f3643096e81ff1d521a7c7d2dc75da80817af1e2c51808ec853304e255315c9a90a54ebc36e2cec597bda1207472dbe135eaa9fce52679940c6d0da29d092f7a226a017f65576d8845058832a2072c5f8dad6df77e8e302ea559023c8b66ef6b5273e4ecb47fad2d32b753f8218ee61ee041def6a8ae8ad37e55edc39924fa91d4d19c4ddfb9e007bdde39d545b8dd43711cd9c5126c8fb2fb12af7acdbb8ccc10049ca041f3de8e0c7668a3a99e6cd4c9514b4b1c74e5fe46b5f68bc8dc56d9e2af359b96bc2c1449761be351a0b6000bb196930083d8f0611f7e9caaa7fe0af6066d4c946504ca057b4e6d335a343083c3151464a07d1dffe9a0e37a9376d91df9574b66f6567fd376d390e4d2f874a6953f1c62ca7a79e05be574fd0bbcfb1ee0535180cde5112ef0cc72316acf972ba70c9f0e0172012caf2d7f905dbb4fd311fc20741f466dd059721b07d74a4c7f613c1911f89e20550877e57783c2c0aeb008cae206c6223bb950afaa2f52ac2e710f96454eeb44e370b82347748e5927fc3e9dd70023322adb4cd16d86fa17c959aff88d2e120073ef02fe8fe30589a28e1c4e092d9f5e5c74f5ba329eeabd13b354ce02cc9d3e58466309234af58c7f3328e6c52e835fed8fabc5f02ecd48d9c7d68031a22f608f01a38d2bb9161c834384f7552db72dec122cac34955bc646a7d5ffdbd5f98755a14cf1ba464754a8d95151627d40fce5169009ff9e2d6a4f55d001f4ad710247aa6db325f747e586233b3dc7c9deeeb83964ba689e62b1a909351f920512f239d3461166db821b04f22b4d0f10dc74f4f87184e479712fb00e2cc40553fe00ef1c80cdbccd65c0cf4df10ff938ea1fae1bb1e7d61d41da708bcb0563ec6fe2c2c0c3ac77d85b4b06e04efb896de56ac102d9bbaea6f98caa63358d9a8fdd1d4725444c05635eb5b51f51ff4c295021db50bc46291aead17a72cfef7d06863349ffc64d31e95a0c484cbe2eb8aa7cc6d3b7d1a85720766c2e62229727efc19ea9fe349273eeeb6b56746ae77a580122496720db04adb3f0b7c41d619c138adbd62237ceabb33a579135f059e67630e4ec33863d8661049dddf2b27e3d8e97236ba7dd76c5e79f32ae6d948216620e3df433bdd086ee74a02c5fd0710e5bd8a383ff74ba8daf7256b343e6b03dad888b9f790734c43936ed368e2e6440dc33873c5bff04367a1f8d3d6e10f0e35b63f9a5bc56e893ad551c143b006d2824bea9342759c8bcd1e8ef2af60424d45cf8b8d56b3e742bbbeeb0c67da23cbf2b5a209df850e9663ac8b21f47082247f9a0f4fb9aa2c8247239a23abb90f67560d60d9237125583ec673e8ae613e0513100ecfa9ae32e792c662ecf99e0d51b3e3cee15c493d0a61a388f20a83a1e2ca4ead554e741da6ee158fe13865988049d7119d988612f70008a171ce40448b23ec3dc6035347c71f114ca9a3a644d7c3f3afbc91264771b9c5b0e0d85ad83367edecb32e07a96d2aaaab69c0ffabc6ff0bc516d8ab8f23317abd848ed1b23679c4ec0301bb5732b38b32dd4295365beb3a2e4e49e8bbad4c22526f02a695fb26c962293262a559cf98a1427001a9c36dd77a53d68d39b6e0bf778e18907377642ece0c1f9f5970033ce48054425e8474b94c75b46ef833e88103b643a1c8dec1109bb67993714c258a848ebfc8f59755eda55b36f72a7fe5175ec0fc1e10b7607f797fdeda8799054dc9c6a3dce88366d273fd65aff7304324d4cf18246cbec3f30e7692287b2a0aebc8b7611cb0d8ccda1b2ea2ae01164dbd445b7bf058ce47d7672e36272b1b89acfd4c4407167e07cc58a693bf6f904359b98259be510ac9e098ec68773487fb8ee1a28a6b856d6ae7790e1140add5144940301316f575ccf08be685477b3ccf7a8b48559d9d8fe855f54b065e325f3c39ca19674061ba9311a4672247b0f588d079cfd230f129a40d680111e0ed056ff36554e51b073b57308cc14429c26b8dd2823fef6e4d4faf8ed2d9c57e52178d70e8e21937e1999033f1c0e93ddb58d1dffba51d46c781c76e50bf61f3822cdedd6694788275940a5c381f919506a44de984032f6d2f81b2194f42b3a2ad8d6292e3a8012283f356110dd689c8a8899399dc866edd3b57283e39636a6c1e00167fecd6cd2a85d0c753d38b56192e0eb4de265e1a21afc3a1268162a01acdd0d2e61b6eea26e63d4ad70e5bd4e3f5cb494a1605ec1c119a2d3d1a91b142a82538c4d7d6a15d3c02c7845998d1cdcb84b8ed524791ee618ddc39b52127c25eeaaa38485e8ddd5ffbd83221730f1a817c4ef9bfaaaf13e31be734512b706c4c7c6b4652888bad7cbd07b7d3bd8f3d30bd636f870f0c38a3da5d0f863941e3403d328f188ede6aa126a6e165e4a730290e1659abbbc37e6ec3c9cd405bd44707c2e2180822cd29bd372126224fa51b7ff1d24828043145fac7a2ebe232f74978701ee367e4ccce49c8d57aee5fb26ef5973626ec6660094e455862b92bf051bf4f228009f385843fe13f6e049a8b30fe1c232facc667e4525db9a06000b6e1b18925be70346074060e9f6393e002008d08f68b39fa80a044f79e5f11c9f4e30a610fdcb3da51445d9033fdc32d8144116c7328dd764ebc720fad76124cad50161f58524e3822edb6f5fa13abd0c48e8ddab06fd788daab33b20d3d5c3ffbfd8d59cf8cd5f36dae285145e53e8b1eb232de01c06e59bad6e90e106ee4d4796d69711586c2d400f512393b5ecec6ea84096c8b8eb18ad92301672e4766869c730d3e962801f52a24bd2a36f32006372858f81809d43293a692094dc366fd78b937c13c90581f09131a7c49aba3d0b6f9e25efb4cc2b9245f65d859ea2997340cc93c9f4430f46d8c440f0bd4da6fc2d5aa5724569bcec7d2eb377a313f2ff27fcf2a23fcdd43cb8773dafd40b1a5dc8050ccfb4905386d77d0d4c289d0464600b087aab92d31285f7065393567b2ac063ac6c14bab35d7524c81bb96e7477240382cb63e043498e5df0dcd0b1b1de541003c344c8a9834faffaee6a13e632a09a1175abe06896251678c5926780cee05676aa9a90e40ab652819b1c8cec7f470e82def32dad929a395002c13c777423def5d00dd0c90970e7410617000f80c7931e20bd5552dc53941f46d8f774033a99f3ad58d37c61b60e91812c63300d386f6d6e8588d0fadb89b376cde695f9f0d0c5727729860bff543c2421b52590cbaa6557c5156f7e3c8386d62109e57de7604a5d84e327b869e72974b1485eaada13f382ed0dfbb8c9f0c74d91a11870545844b90b4b4cb38be2cdd14922f2012b2732473d3047fcdb61fef57eda556d8e4c5ff343d063f1b966b499a4d38e02b8c59c4266201950d80f1e0e3c28db672600a87d307a22ea12c33f0cdada179c78e1a9dc023a08192d9959549b60122a55885b6d6cdd8d5e34cb12ef5f6ff518c41bb8f4b27e2a8f3571b5583b4e184591fa772db83785f54ffa4831d9ee1de5a451ca78d63e1c73ac44279d2e95aa403da1f8e85e8cd25fe6e8f0823c10d8653cf31e6c62be04d02f420dba05fb0df92d2633091ca493681a09d177148b264c255854a477bdfb710440f57bb6db37dbf2d085bea8dee667bc33d0ce121a23b88f287f4203c80f569b7f77c21d07be484f89fabdce93a354b127d1a60fc4200c14e664c53232dd9902349dc757ef076bed87afcd88811d8240eb45919ada23de3dc7911c80bed64b68ddcfbca3acc75e111012b6aeae7b6b32abf6efe68d531663c0b48ad855d5d26b86890fefd1329bd3cbc3d63be359e37aee21738030b89916c7bbbcb15e9455cd6a0</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<tags>
<tag> 概率论 </tag>
</tags>
</entry>
<entry>
<title>C++sort()排序应用</title>
<link href="/posts/62096.html"/>
<url>/posts/62096.html</url>
<content type="html"><![CDATA[<p>#C++ sort()排序</p><p>##例题一:<br>题目描述</p><blockquote><p>某涉密单位下发了某种票据,并要在年终全部收回。每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。你的任务是通过编程,找出断号的ID和重号的ID。假设断号不可能发生在最大和最小号。</p><blockquote><p>输入格式<br>第一行包含整数 N,表示后面共有 N 行数据。接下来 N 行,每行包含空格分开的若干个(不大于100个)正整数(不大于100000),每个整数代表一个ID号。</p></blockquote></blockquote><blockquote><blockquote><p>输出格式<br>要求程序输出1行,含两个整数 m,n,用空格分隔。其中,m表示断号ID,n表示重号ID。</p></blockquote></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"><iostream></span></span><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"><vector></span></span><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"><algorithm></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> N<span class="token punctuation">;</span> cin <span class="token operator">>></span> N<span class="token punctuation">;</span> vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> ID<span class="token punctuation">;</span> <span class="token keyword">int</span> temp<span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span>cin <span class="token operator">>></span> temp<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment" spellcheck="true">//输出的时候在输入完数据之后要按Ctrl+Z,然后回车,就可以输出结果了</span> ID<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>temp<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">sort</span><span class="token punctuation">(</span>ID<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> ID<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> m <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 初始化m为一个无效值</span> <span class="token keyword">int</span> n <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 初始化n为一个无效值</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> ID<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>ID<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">-</span> ID<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> m <span class="token operator">=</span> ID<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>ID<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> ID<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> n <span class="token operator">=</span> ID<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> cout <span class="token operator"><<</span> m <span class="token operator"><<</span> <span class="token string">" "</span> <span class="token operator"><<</span> n<span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>##例题二:<br>题目描述</p><blockquote><p>某次科研调查时得到了几个自然数,每个数均不超过1.5<10^9。已知不相同的数不超过10^4个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。</p></blockquote><blockquote><p>输入描述<br>第1行是整数,表示自然数的个数。第2~n+1行每行一个自然数。其中1≤n≤2×10^5,每个数均不超过1.5≤10^9</p><p>输出描述<br>输出m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。</p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"><bits/stdc++.h></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">;</span>vector <span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> number<span class="token punctuation">;</span><span class="token keyword">int</span> temp<span class="token punctuation">;</span><span class="token keyword">int</span> c<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> cin<span class="token operator">>></span>n<span class="token punctuation">;</span><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator"><</span>n<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span> cin<span class="token operator">>></span>temp<span class="token punctuation">;</span> number<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>temp<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token function">sort</span><span class="token punctuation">(</span>number<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>number<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator"><</span>n<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> c<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>number<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token operator">!=</span>number<span class="token punctuation">[</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">//当下一个数不和当前数相等时说明重复数结束</span> <span class="token punctuation">{</span> cout<span class="token operator"><<</span>number<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token operator"><<</span><span class="token string">" "</span><span class="token operator"><<</span>c<span class="token operator"><<</span>endl<span class="token punctuation">;</span> c<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2><span id="li-ti-san">例题三</span><a href="#li-ti-san" class="header-anchor">#</a></h2><blockquote><p>设有几个正整数a1..a_n,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。<br>输入描述<br>第一行有一个整数,表示数字个数n。第二行有n个整数,表示给出的n个整数a_i.其中,1≤n≤20,1≤a_i≤10^9。<br>输出描述<br>输出一个正整数,表示最大的整数</p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"><bits/stdc++.h></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">;</span>string temp<span class="token punctuation">;</span>vector<span class="token operator"><</span>string<span class="token operator">></span> number<span class="token punctuation">;</span><span class="token keyword">bool</span> <span class="token function">cmp</span><span class="token punctuation">(</span>string a<span class="token punctuation">,</span>string b<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>a<span class="token operator">+</span>b<span class="token operator">></span>b<span class="token operator">+</span>a<span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//如果前面的大,则第一个参数在第二个参数之前,实现了降序排序</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">else</span> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> cin<span class="token operator">>></span>n<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator"><</span>n<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cin<span class="token operator">>></span>temp<span class="token punctuation">;</span> number<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>temp<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">sort</span><span class="token punctuation">(</span>number<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>number<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>cmp<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">auto</span> i<span class="token operator">:</span>number<span class="token punctuation">)</span> <span class="token punctuation">{</span> cout<span class="token operator"><<</span>i<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p>通过这题我想来介绍一下c++里面的sort()函数的细节。<br>首先sort()里面一般有三个参数,第一个是排序的起点,第二个则是终点,这两个参数类型都必须是迭代器。第三个参数是比较参数,决定排序的方式。<br>这里c++官方技术文档是这样定义的:<br><strong>第一个和第二个参数:随机访问要排序的序列的初始位置和最终位置的迭代器。使用的范围为,包含first和last[first,last)之间的所有元素,包括first指向的元素但不包括last指向的元素。随机访问迭代器应指向一个类型交换已正确定义,并且既可移动构造又可移动分配。</strong><br><strong>第三个参数: 接受范围内的两个元素作为参数并返回可转换为 的值的二元函数bool。返回的值指示作为第一个参数传递的元素是否被视为在它定义的特定严格弱排序中位于第二个参数之前。该函数不得修改其任何参数。这可以是函数指针或函数对象。</strong></p><blockquote><p>这里不用管严格弱排序的意思,这句话换句话的意思就是说,如果返回值是True,则第一个参数将会在第二个参数前面,返回值是True则反之。<br>拿本题的例子来说:</p></blockquote></blockquote><blockquote><pre><code> bool cmp(string a,string b) { if(a+b>b+a) //如果前面参数1大,则第一个参数会第二个参数之前,总体上来看就是大的会在小的前面,这就相当于实现了降序排序。 return true; else return false; } //这里的a就代表了参数1,这里的b就代表了参数2.</code></pre></blockquote><p>第三个参数可以自己写,也可以调用系统自带的:</p><blockquote></blockquote><h2><span id="jie-gou-ti-pai-xu">结构体排序</span><a href="#jie-gou-ti-pai-xu" class="header-anchor">#</a></h2><h3><span id="li-ti-yi"><strong>例题一</strong></span><a href="#li-ti-yi" class="header-anchor">#</a></h3><blockquote><p>某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 名学生发奖学金。期末,每个学生都有 3 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,<strong>如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,</strong>这样,每个学生的排序是唯一确定的。<br>任务:先根据输入的 3 门课的成绩计算总分,然后按上述规则排序,<strong>最后按排名顺序输出前 5 名学生的学号和总分</strong>。注意,在前 5 名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)是:</p><pre><code> 7 279 5 279</code></pre><p>这两行数据的含义是:总分最高的两个同学的学号依次是 7 号、5 号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和),但学号为 7 的学生语文成绩更高一些。如果你的前两名的输出数据是:</p><pre><code> 5 279 7 279</code></pre><p> 则按输出错误处理,不能得分。<br> 输入描述<br> 第1行为一个正整数n(6≤n≤300),表示该校参加评选的学生人数。第2到n+1行,每行有3个用空格隔开的数字,每个数字都在0到100之间。第j行的3个数字依次表示学号为j-1的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为1~n(恰好是输入数据的行号减1)。所给的数据都是正确的,不必检验。<br> 输出描述<br> 输出共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。</p></blockquote><h3><span id="yuan-dai-ma">源代码</span><a href="#yuan-dai-ma" class="header-anchor">#</a></h3><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"><bits/stdc++.h></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">struct</span> score<span class="token punctuation">{</span> <span class="token keyword">int</span> index<span class="token punctuation">;</span> <span class="token keyword">int</span> chinese<span class="token punctuation">;</span> <span class="token keyword">int</span> math<span class="token punctuation">;</span> <span class="token keyword">int</span> english<span class="token punctuation">;</span> <span class="token keyword">int</span> sum<span class="token punctuation">;</span><span class="token punctuation">}</span>s<span class="token punctuation">[</span><span class="token number">305</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">bool</span> <span class="token function">cmp</span><span class="token punctuation">(</span><span class="token keyword">struct</span> score a<span class="token punctuation">,</span><span class="token keyword">struct</span> score b<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span>sum<span class="token operator">==</span>b<span class="token punctuation">.</span>sum<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span>chinese<span class="token operator">==</span>b<span class="token punctuation">.</span>chinese<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span>index<span class="token operator"><</span>b<span class="token punctuation">.</span>index<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">else</span> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span>chinese<span class="token operator">></span>b<span class="token punctuation">.</span>chinese<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">else</span> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span>sum<span class="token operator">></span>b<span class="token punctuation">.</span>sum<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">else</span> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">int</span> n<span class="token punctuation">;</span> cin<span class="token operator">>></span>n<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>j<span class="token operator"><=</span>n<span class="token punctuation">;</span>j<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> s<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>index<span class="token operator">=</span>j<span class="token punctuation">;</span> cin<span class="token operator">>></span>s<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>chinese<span class="token operator">>></span>s<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>math<span class="token operator">>></span>s<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>english<span class="token punctuation">;</span> s<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>sum<span class="token operator">=</span>s<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>chinese<span class="token operator">+</span>s<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>math<span class="token operator">+</span>s<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>english<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">sort</span><span class="token punctuation">(</span>s<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span>s<span class="token operator">+</span><span class="token number">1</span><span class="token operator">+</span>n<span class="token punctuation">,</span> cmp<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator"><=</span><span class="token number">5</span><span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cout<span class="token operator"><<</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>index<span class="token operator"><<</span><span class="token string">" "</span><span class="token operator"><<</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>sum<span class="token operator"><<</span>endl<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3><span id="li-ti-er">例题二</span><a href="#li-ti-er" class="header-anchor">#</a></h3><blockquote><p>外卖店优先级<br>题目描述<br>“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果 优先级小于等于 3,则会被清除出优先缓存。给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优 先缓存中?<br>输入描述<br>第一行包含 3 个整数 N,M,T。以下 M 行每行包含两个整数 ts,id,表示 ts 时刻编号 id 的外卖店收到一个订单。其中,1≤N,M,T≤10^5 ,1≤ts≤T,1≤id≤N。<br>输出描述<br>输出一个整数代表答案。</p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"><bits/stdc++.h></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> M<span class="token punctuation">,</span>N<span class="token punctuation">,</span>T<span class="token punctuation">;</span><span class="token keyword">int</span> locate<span class="token punctuation">[</span><span class="token number">2000000</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//定位上一次各个的订单时间</span><span class="token keyword">int</span> prior<span class="token punctuation">[</span><span class="token number">2000000</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//存储各个店的优先级</span><span class="token keyword">int</span> flag<span class="token punctuation">[</span><span class="token number">2000000</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//标记是否满足优先级>5</span><span class="token keyword">struct</span> store<span class="token punctuation">{</span> <span class="token keyword">int</span> id<span class="token punctuation">;</span> <span class="token keyword">int</span> ts<span class="token punctuation">;</span><span class="token punctuation">}</span>store<span class="token punctuation">[</span><span class="token number">200000</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">bool</span> <span class="token function">cmp</span><span class="token punctuation">(</span><span class="token keyword">struct</span> store a<span class="token punctuation">,</span><span class="token keyword">struct</span> store b<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span>ts<span class="token operator">==</span>b<span class="token punctuation">.</span>ts<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> a<span class="token punctuation">.</span>id<span class="token operator"><</span>b<span class="token punctuation">.</span>id<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> a<span class="token punctuation">.</span>ts<span class="token operator"><</span>b<span class="token punctuation">.</span>ts<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> cin<span class="token operator">>></span>N<span class="token operator">>></span>M<span class="token operator">>></span>T<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator"><</span>M<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cin<span class="token operator">>></span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>ts<span class="token operator">>></span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">sort</span><span class="token punctuation">(</span>store<span class="token punctuation">,</span>store<span class="token operator">+</span>M<span class="token punctuation">,</span> cmp<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator"><</span>M<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>ts<span class="token operator">!=</span>locate<span class="token punctuation">[</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> prior<span class="token punctuation">[</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">]</span><span class="token operator">=</span> prior<span class="token punctuation">[</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">]</span><span class="token operator">-</span><span class="token punctuation">(</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>ts<span class="token operator">-</span>locate<span class="token punctuation">[</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token comment" spellcheck="true">//如果当前数组的时刻与当前数组对应的ID店的上一次订单时间不相等,就减去对应相差的时间。</span> prior<span class="token punctuation">[</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">]</span><span class="token operator">=</span> prior<span class="token punctuation">[</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">]</span><span class="token operator"><</span><span class="token number">0</span><span class="token operator">?</span><span class="token number">0</span><span class="token operator">:</span> prior<span class="token punctuation">[</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//防止优先级<0</span> <span class="token keyword">if</span><span class="token punctuation">(</span>prior<span class="token punctuation">[</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">]</span><span class="token operator"><=</span><span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> flag<span class="token punctuation">[</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">]</span><span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token comment" spellcheck="true">//标记优先级</span> prior<span class="token punctuation">[</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">]</span><span class="token operator">+</span><span class="token operator">=</span><span class="token number">2</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//优先级+2</span> <span class="token keyword">if</span><span class="token punctuation">(</span>prior<span class="token punctuation">[</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">]</span><span class="token operator">></span><span class="token number">5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> flag<span class="token punctuation">[</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">]</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token comment" spellcheck="true">//标记优先级</span> locate<span class="token punctuation">[</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">]</span><span class="token operator">=</span>store<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>ts<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//当前时间判断完了,就将当前时间设置为该ID店的最后一次订单时间。用于下一次比较</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator"><=</span>N<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>locate<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token operator"><</span>T<span class="token punctuation">)</span> <span class="token punctuation">{</span> prior<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token operator">=</span> prior<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token operator">-</span><span class="token punctuation">(</span>T<span class="token operator">-</span>locate<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span><span class="token punctuation">(</span>prior<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token operator"><=</span><span class="token number">3</span><span class="token punctuation">)</span> flag<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">int</span> ans<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator"><=</span>N<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>flag<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> ans<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>cout<span class="token operator"><<</span>ans<span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p>这里我非常有必要解释一下为什么prior[store[i].id]= prior[store[i].id]-(store[i].ts-locate[store[i].id]) +1;这段代码要+1。我们知道这段代码的功能其实是想要求出两段时间相差了多少,比如6-9中间相差了2个数字,我们直接9-6求出来是等于3的,这个3其中也把9算了进去,但是由于我们到达9的时候是要加优先级的,所以我们要把多减掉的一位给它加回来 </p><blockquote><p>图解:</p><blockquote><p><img src="E:\BLogTest\source_posts\图片保存\上架课程视频\上架课程.mp4"></p></blockquote></blockquote></blockquote>]]></content>
<tags>
<tag> c++ </tag>
<tag> 数据结构 </tag>
</tags>
</entry>
<entry>
<title>汉诺塔(hanio tower)递归实现的原理思考</title>
<link href="/posts/41810.html"/>
<url>/posts/41810.html</url>
<content type="html"><![CDATA[<h1><span id="han-nuo-ta-hanio-tower-di-gui-shi-xian-de-yuan-li-si-kao">汉诺塔(hanio tower)递归实现的原理思考</span><a href="#han-nuo-ta-hanio-tower-di-gui-shi-xian-de-yuan-li-si-kao" class="header-anchor">#</a></h1><h2><span id="qian-yan">前言</span><a href="#qian-yan" class="header-anchor">#</a></h2><blockquote><p>昨天我是先看的汉诺塔理论上的实现原理,看完之后感觉还行,这不是挺简单的嘛。但是理论总归要去实际操作去实现的嘛。于是我就去看了汉诺塔的代码实现方法,看了之后说实话我有点懵逼.WTF?????这么神奇??就几句话就搞定啦??凭什么递归就可以去实现汉诺塔?递归和汉诺塔实现原理的共性是什么,以至于递归就可以完美实现汉诺塔??这些疑问困扰着我。然后我就去搜集有关的视频和文章,结果就是…我还是没理解真正的原理..很多博主的讲解普遍集中在将汉诺塔去一步一步实现了一遍,没有明确提到为什么选择递归算法就可以完美实现汉诺塔。后来,我通过对这些博主讲解的信息进行综合分析,总算有了一点小小的理解。下面我就来分享一下我的个人理解。</p></blockquote><h2><span id="han-nuo-ta-jie-shao">汉诺塔介绍</span><a href="#han-nuo-ta-jie-shao" class="header-anchor">#</a></h2><blockquote><p>汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子(A,B,C),在一根柱子(A)上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子(B)上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。</p><p><strong>根据上文我们可以捕获汉诺塔五点关键信息:①我们有三根柱子分别标记为A,B,C。②A柱子上有从上到下依次增大的圆盘。③我们要将A柱子上的圆盘转移到C柱子上,转移之后盘子形状还是从上到下依次增大。④过程中可以通过B柱子去临时存放。⑤盘子在转移过程中小的盘子只能在大盘子的上方。</strong></p></blockquote><h2><span id="han-nuo-ta-de-yuan-li-shi-xian">汉诺塔的原理实现</span><a href="#han-nuo-ta-de-yuan-li-shi-xian" class="header-anchor">#</a></h2><blockquote><p>话不多说,汉诺塔实在有点抽象,接下来我将通过结合动态图片进行对汉诺塔的实现原理的介绍</p></blockquote><blockquote><hr><p>我的总体讲解原则是,由简入繁。所以我们先从一片圆盘(n=1)开始讲起<br><img src="https://pan.axianyu.cn/f/61xTe/a5d34544a172b682ea3ed2193e684d92_MD5.gif" alt="n=1时汉诺塔运行情况"></p><blockquote><p><strong>图中我们可以看到当n=1的时候,我们是可以把A柱子移到C柱子达到目标,这个简单我提一嘴就一笔带过了</strong></p></blockquote></blockquote><hr><blockquote><p><strong>接下来我们来看n=2的时候的运行情况</strong></p></blockquote><hr><blockquote><p><img src="https://pan.axianyu.cn/f/VgxI2/541fd88369dbfe89ae98589e39bcbf96_MD5.gif" alt="n=2"></p></blockquote><blockquote><p>由图中我们可以看出当A柱的总盘子数大于1的时候,要使从盘子原封不动从A柱移动到C柱子。且大盘子只能在小盘子下面,那我们只能先把上面的小盘子先暂时存到B柱作为过渡,然后我们就可以把A柱上的最大的盘子移动到C柱子,最后把B柱子上的小盘子移动到C柱子就可以了。我们通过总结这段运行过程可以发现:我们只要将n-1个盘子,(n代表最底下的盘子),一次性移动到B柱子上进行过渡,然后第n个盘子移动到C柱子就可以了,然后再把B柱上的盘子整体移动到C柱子就可以完成了。<strong>用更精简的语言来描述就是:先A->B,然后A->C,最后B->C</strong></p></blockquote><hr><blockquote><p>我们再来看一个n=3的运行图</p></blockquote><hr><blockquote><p><img src="https://pan.axianyu.cn/f/9gBi7/8b0abd59590d83cc55455b1e5fb45291_MD5.gif" alt="n=3"></p></blockquote><hr><blockquote><p>怎么样?看完了n=3的动图演示,是不是感觉一脸懵逼???(反正我昨天是这样的qwq)。话不多说,我就来一步一步拆解一下n=3的运行机理。在这之前呢,我们要明确一下我们在n=2的时候得出的结论:<strong>先A->B,然后A->C,最后B->C。这个法则将贯穿全文,无论n的值为多少</strong></p></blockquote><hr><h3><span id="yuan-li-fen-xi">原理分析</span><a href="#yuan-li-fen-xi" class="header-anchor">#</a></h3><p><strong>这里我提前说明一下,我定义最左边的柱子为A,中间的柱子为B,最右边的柱子为C</strong></p><h4><span id="di-yi-bu-chai-jie">第一步拆解</span><a href="#di-yi-bu-chai-jie" class="header-anchor">#</a></h4><blockquote><p>我们知道n=2的时候,程序的运行步骤是先从A->B将(n-1)部分的盘子移动到B柱寄存,然后执行A->C,将最底下标号为n的盘子移动到C,最后执行B->C将寄存在B柱子的(n-1)个柱子移动到C柱子。那我们分析n=3的时候我们就可以将下图蓝色盘子上方的盘子(图中阴影部分)抽象成一个整体,那我们要求的n=3,3个盘子的转移问题就变成了n=2转移两个盘子的问题。</p></blockquote><p><img src="https://pan.axianyu.cn/f/MrRt7/7009d8330a7c9964f9615ed2486fa24d_MD5.png" alt="@抽象前 "><br><img src="https://pan.axianyu.cn/f/JqPUM/2e48aec8daa121091a8b21cc8358fab8_MD5.png" alt="@抽象后"></p><blockquote><p>接下来我们将抽象后的盘子进行转移,按照n=2的转移办法,粉色的盘子会被投放到B柱子上,然后蓝色的盘子将会被投放到C柱子上。(状态图如下图)<br><img src="https://pan.axianyu.cn/f/o8GHO/424160929763221b3e374607490c0df5_MD5.png" alt="@状态图"><br>到了这个状态之后,按照转移的顺序,我们应该把粉色的盘子转移到C柱就可以完成任务了。但是!我们这个粉色的盘子是我们抽象出来的,它内部还有俩盘子呢:所以我们要对着两个盘子再次进行分析。</p><blockquote><p><img src="https://pan.axianyu.cn/f/d2bIN/1f8c641d918d029243c8332218bdacfd_MD5.png" alt="@粉色盒子内部"></p></blockquote></blockquote><h4><span id="di-er-bu-chai-jie">第二步拆解</span><a href="#di-er-bu-chai-jie" class="header-anchor">#</a></h4><blockquote><p><strong>由于第一步我们是将蓝色盘子上方的两个盘子抽象成了一个,我们程序执行的时候可不能整体移动,所以我们要对这个粉色的整体盘子再次进行拆解,根据第一步拆解的最后步骤我们可以看到,我们第二步拆解的时候,粉色盘子是位于B柱子的时候进来的,那个视角的参照物我们是基于粉色和蓝色盘子的视角(主视角)来看的。所以从那个视角来看,我们的粉色盘子是从B柱子进入第二步拆解。既然我们进入了第二步拆解,我们的视角参照物应该切换成基于黄色和绿色盘子的视角(次视角),我们要从这个视角来重复执行A->B,A->C,B->C的步骤,但是这里要注意,我们最终的观察角度是通过主视角来看的,于是主视角所看到的B柱子其实对应的是次视角的C柱子:因为我们是从主视角的B柱子进入的次视角,在次视角中最后是要将盘子从A->C,随后返回给主视角,所以说次视角的C相当于主视角的B柱子,次视角的B相当于主视角的C柱子。接下来我们通过图片来加深一下理解</strong><br>如下图。<br><img src="https://pan.axianyu.cn/f/g2Oik/55e4deb5b399344ff45f3af0a8545d79_MD5.png" alt="@二次拆解后,次视角"><br>接下来我们来看一下次视角状态下盘子移动后的A->B,A->C的中间结果<br><img src="https://pan.axianyu.cn/f/z8yFw/cf12c2dc331bb55d7393862df255877f_MD5.gif" alt="@次视角中进行移动的中间结果图"><br>那我们的主视角是什么样的情况呢,接下来我们来看一下次视角对应的主视角盘子移动情况<br><img src="https://pan.axianyu.cn/f/N3WIm/c2986e99806edf18057e79aab0be7192_MD5.gif" alt="@主视角中进行移动的中间结果图"></p></blockquote><blockquote><p><strong>看到这里我们相信你就明白了吧,每一次对抽象盘子进行拆解的时候,它们都会进入以抽象盘子为基础的次视角,但是我们从外部来看到的应该是没有拆解前的主视角的移动情况。所以啊,我们再看看一遍n=3的时候的运行图,来加强一下理解。我觉得最难的点在于我们人总是会惯性地从我们的主视角去看,而每一次拆解进入的时候是抽象盘子的次视角在执行A->B,A->C,B->C的迁移动作。这导致了我们看的很懵逼,越看越难理解。</strong><br><img src="https://pan.axianyu.cn/f/9gBi7/8b0abd59590d83cc55455b1e5fb45291_MD5.gif" alt="n=3"></p></blockquote><p>好了,思路到这里我们点到为止,大致的运行思路就是这样,关键在于主次视角的切换的理解,接下来我们将为什么用递归来实现汉诺塔</p><h2><span id="wei-shi-me-yong-di-gui-suan-fa-shi-xian">为什么用递归算法实现?</span><a href="#wei-shi-me-yong-di-gui-suan-fa-shi-xian" class="header-anchor">#</a></h2><blockquote><p>要解决这个疑问呢,我们首先要搞明白,汉诺塔的盘子的迁移特性和递归的特性,它们两者之间的有没有共通性才是我们选择递归来实现汉诺塔的关键。那下面我来分析一下,看看它们之间是不是真的有共通点</p></blockquote><blockquote><p>汉诺塔盘子的迁移特性</p><blockquote><p>我们通过对两个以上的盘子进行抽象,让我们把要解决的问题转换成一个个n=2的盘子迁移问题,直到n=1为止。比如我们总的n=3,那我们第一步就要把三个盘子中的两个抽象成1个,保留最底下的那个盘子。这样我们要解决的问题又变成了解决n=2的盘子迁移问题。换句话来我们将复杂的问题,通过层层外包进行了分布化处理</p></blockquote></blockquote><blockquote><p>递归的特性</p><blockquote><p>递归可以类比成公司领导下发秘密任务,通过层层下属的反馈最后达到完成任务的目的。假如老板A准备发了一则秘密任务“test”,于是老板把他的亲信”B”高管叫过来了,说你去帮我完成,完成后给予他反馈。然后”B”高管肯定也不会自己干的,于是它就把任务告诉了他的亲信”C“,让C完成之后给予反馈。</p></blockquote></blockquote><blockquote><p>怎么样?看了汉诺塔的迁移特性和递归的特性,有没有发现他们其实都是在通过层层外包,最后将问题转换成最简单的问题再去解决。最后达到将复杂的问题简单化的目标。所以我们完全可以使用递归算法去实现汉诺塔问题!!</p></blockquote><h2><span id="dai-ma-shi-xian">代码实现</span><a href="#dai-ma-shi-xian" class="header-anchor">#</a></h2><blockquote><p>知道了为什么能用递归算法实现汉诺塔问题,接下来我们就来感受一下在代码下的汉诺塔实现,这里我给出两个版本,一个是python版本,一个是c++版本。</p></blockquote><hr><blockquote><p>c++版本</p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> sum <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> m<span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">hanoi</span><span class="token punctuation">(</span><span class="token keyword">char</span> x<span class="token punctuation">,</span><span class="token keyword">char</span> y<span class="token punctuation">,</span><span class="token keyword">char</span> z<span class="token punctuation">,</span><span class="token keyword">int</span> n<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment" spellcheck="true">//x,y,z分别代表A,B,C柱子</span> <span class="token keyword">if</span><span class="token punctuation">(</span>n<span class="token operator">==</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> sum<span class="token operator">++</span><span class="token punctuation">;</span> cout<span class="token operator"><<</span><span class="token string">"#"</span><span class="token operator"><<</span>n<span class="token operator"><<</span><span class="token string">": "</span><span class="token operator"><<</span>x<span class="token operator"><<</span><span class="token string">"->"</span><span class="token operator"><<</span>z<span class="token operator"><<</span>endl<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//A->C</span> <span class="token punctuation">}</span><span class="token comment" spellcheck="true">//当n=1,也就是只有一个盘子的时候我们直接把盘子丢给C柱子即可</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><span class="token comment" spellcheck="true">//否则我们就要进入else语句,通过不断的抽象化盘子,去简化问题</span> <span class="token function">hanoi</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span>z<span class="token punctuation">,</span>y<span class="token punctuation">,</span>n<span class="token number">-1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//抽象化盘子将A->B柱子</span> sum<span class="token operator">++</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//</span> cout<span class="token operator"><<</span><span class="token string">"#"</span><span class="token operator"><<</span>n<span class="token operator"><<</span><span class="token string">": "</span><span class="token operator"><<</span>x<span class="token operator"><<</span><span class="token string">"->"</span><span class="token operator"><<</span>z<span class="token operator"><<</span>endl<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//执行完抽象化的盘子之后,这里我们是将最底下的那个盘子直接移动到C柱子上</span> <span class="token function">hanoi</span><span class="token punctuation">(</span>y<span class="token punctuation">,</span>x<span class="token punctuation">,</span>z<span class="token punctuation">,</span>n<span class="token number">-1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//最底下的盘子我们已经在上面移动到了C柱子,接下来我们把暂存在B柱子的盘子移动到C柱子就好了,这段代码就是实现这个功能B->C柱子</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> n<span class="token punctuation">;</span> cin<span class="token operator">>></span>n<span class="token operator">>></span>m<span class="token punctuation">;</span> <span class="token function">hanoi</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">,</span><span class="token string">'B'</span><span class="token punctuation">,</span><span class="token string">'C'</span><span class="token punctuation">,</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> cout<span class="token operator"><<</span>sum<span class="token operator"><<</span>endl<span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p>当我们执行抽象化盘子从B柱子->柱子C的时候</p><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token function">hanoi</span><span class="token punctuation">(</span>y<span class="token punctuation">,</span>x<span class="token punctuation">,</span>z<span class="token punctuation">,</span>n<span class="token number">-1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//最底下的盘子我们已经在上面移动到了C柱子,接下来我们把暂存在B柱子的盘子移动到C柱子就好了,这段代码就是实现这个功能</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>程序通过递归下一次会进入A->B柱的代码:</p><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token function">hanoi</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span>z<span class="token punctuation">,</span>y<span class="token punctuation">,</span>n<span class="token number">-1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//抽象化盘子将A->B柱子</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>**发现没有?这里有一个主次视角的转换。我来举个例子好了比如我们先执行hanoi(y,x,z,n-1); 这里y=B,x=A,z=C,代入可以得到hanoi(B,A,C,n-1);,接着执行hanoi(x,z,y,n-1); 这里我们将刚刚函数读入的x,y,z对应填入这个函数,可以得到hanoi(A,,C,B,n-1); 文字有点不好描述,请看下面的动图演示:(还是以n=3进入n=2的数据作为例子)</p><p><img src="https://pan.axianyu.cn/f/vbvI3/5df202a191f98469fa79080ff072b92a_MD5.gif" alt="n=3进入n=2,n=2的视角"></p><p>所以我们从n=3的主视角看到的就是如下的运动情况:</p><p><img src="https://pan.axianyu.cn/f/9gBi7/8b0abd59590d83cc55455b1e5fb45291_MD5.gif" alt="n=3的主视角运动情况"></p><p><strong>看到没有!!主视角的黄色盘子第一步移动就去了C盘子,C盘子就对应了次视角的B盘子</strong></p></blockquote><hr><blockquote><p>Python版本</p><pre class="line-numbers language-python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">move</span><span class="token punctuation">(</span>n<span class="token punctuation">,</span>a<span class="token punctuation">,</span>b<span class="token punctuation">,</span>c<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">if</span> n <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">:</span> <span class="token keyword">print</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span><span class="token string">"--->"</span><span class="token punctuation">,</span>c<span class="token punctuation">)</span><span class="token operator">//</span>解决当盘子只剩一个的时候的迁移问题 <span class="token keyword">else</span><span class="token punctuation">:</span> move<span class="token punctuation">(</span>n<span class="token number">-1</span><span class="token punctuation">,</span>a<span class="token punctuation">,</span>c<span class="token punctuation">,</span>b<span class="token punctuation">)</span><span class="token operator">//</span>将抽象化的盘子从A<span class="token operator">-</span><span class="token operator">></span>B <span class="token keyword">print</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span><span class="token string">"--->"</span><span class="token punctuation">,</span>c<span class="token punctuation">)</span><span class="token operator">//</span>把最底下的盘子从A<span class="token operator">-</span><span class="token operator">></span>C柱子 move<span class="token punctuation">(</span>n<span class="token number">-1</span><span class="token punctuation">,</span>b<span class="token punctuation">,</span>a<span class="token punctuation">,</span>c<span class="token punctuation">)</span><span class="token operator">//</span>把抽象的盘子从B<span class="token operator">-</span><span class="token operator">></span>C柱子<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></blockquote><h2><span id="xie-zai-zui-hou">写在最后</span><a href="#xie-zai-zui-hou" class="header-anchor">#</a></h2><blockquote><p>我只能说汉诺塔这个问题,如果单纯告诉程序去运行思路,那看起来是挺简单的,但是深入思考它内部的运行原理是挺抽象的,因为里面涉及了主次视角的转变,而我们又总是以主视角去观察盘子移动的,这就让人感觉产生了汉诺塔运行起来毫无规律的误解。以上就是我对汉诺塔的个人理解。本人水平有限。如果理解错了,请见谅,欢迎指正。</p></blockquote>]]></content>
<tags>
<tag> 数据结构 </tag>
</tags>
</entry>
<entry>
<title>链表题实战</title>
<link href="/posts/29079.html"/>
<url>/posts/29079.html</url>
<content type="html"><![CDATA[<h1><span id="lian-biao-shi-zhan">链表实战</span><a href="#lian-biao-shi-zhan" class="header-anchor">#</a></h1><h2><span id="ti-mu-miao-shu">题目描述</span><a href="#ti-mu-miao-shu" class="header-anchor">#</a></h2><blockquote><p>有 n 辆自行车依次来到停车棚,除了第一辆自行车外,每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或右边。(e.g.停车棚里已经有 3 辆自行车,从左到右编号为:3,5,1。现在编号为 2 的第 4 辆自行车要停在 5 号自行车的左边,所以现在停车棚里的自行车编号是:3,2,5,1)。给定n辆自行车的停放情况,按顺序输出最后停车棚里的自行车编号。n≤100000。</p></blockquote><blockquote><p><strong>输入描述</strong></p><blockquote><p>第一行一个整数 n。 第二行一个整数x。表示第一辆自行车的编号。 以下 n−1 行,每行<br>3 个整数 x,y,z。 z=0 时,表示编号为 x 的自行车恰停放在编号为 y 的自行车的左边。 z=1 时,表示编号为 x 的自行车恰停放在编号为 y 的自行车的右边。</p></blockquote></blockquote><blockquote><p><strong>输出描述</strong></p><blockquote><p>从左到右输出停车棚里的自行车编号</p></blockquote></blockquote><blockquote><p><strong>输入样例</strong></p><blockquote><pre><code> 4 3 1 3 1 2 1 0 5 2 1</code></pre></blockquote></blockquote><blockquote><p><strong>输出样例</strong></p><blockquote><pre><code>3 2 5 1</code></pre></blockquote></blockquote><h2><span id="si-lu">思路</span><a href="#si-lu" class="header-anchor">#</a></h2><h3><span id="jing-tai-lian-biao-shi-xian-si-lu">静态链表实现思路</span><a href="#jing-tai-lian-biao-shi-xian-si-lu" class="header-anchor">#</a></h3><blockquote><p><strong>①:先初始化下标为0,1的链表结点。</strong><br><strong>如图</strong> <img src="https://img1.imgtp.com/2023/08/25/BsOFIdEf.jpg" alt="初始化示意图"></p></blockquote><blockquote><p><strong>②:接下来我们从下标为2的链表结点开始,先将第一辆自行车插入结点0和结点1之间。之后保持结点0,1不动,结点0,1仅仅用于判别左右方向边界。</strong><br><img src="https://img1.imgtp.com/2023/08/25/hldOBjyF.jpg" alt="链表插入示意图"><br><strong>③:由于链表在插入的时候需要一个一个遍历过去,它的时间复杂度是O(n),n题目说是≤100000 。当n过大时,容易引起程序运行超时。所以我们引进一个located[N]定位数组,用于定位每个自行车的位置。这样我们就可以根据自行车的名字直接定位到其结点位置进行插入操作,无需进行遍历查找。</strong><br><strong>④:结合以上三点,我们就可以实现对本题的代码实现</strong></p></blockquote><h2><span id="he-xin-dai-ma">核心代码</span><a href="#he-xin-dai-ma" class="header-anchor">#</a></h2><blockquote><p>创建链表</p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token keyword">struct</span> Node<span class="token punctuation">{</span> <span class="token keyword">int</span> p<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//存储上一个结点</span> <span class="token keyword">int</span> N<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//存储下一个结点</span> <span class="token keyword">int</span> data<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//存储自行车的编号</span><span class="token punctuation">}</span>Node<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p>创建一个locate数组用于存储自行车摆放的结点位置,便于快速定位</p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token keyword">int</span> locate<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><blockquote><p>编写一个初始化函数,设置链表结点0,1作为左右方向的边界</p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token keyword">void</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> Node<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>N<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span> Node<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> now<span class="token operator">=</span><span class="token number">2</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment" spellcheck="true">//对应本文上面思路段落的第一张图片</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p><strong>编写插入数据的自定义函数,用图片来描述的话,就是对应本文思路部分的第二张图片,本节的代码部分理解最好对着图片去模拟,那样会好理解一点。</strong></p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token keyword">void</span> <span class="token function">insert</span><span class="token punctuation">(</span><span class="token keyword">int</span> k<span class="token punctuation">,</span><span class="token keyword">int</span> a<span class="token punctuation">)</span><span class="token comment" spellcheck="true">//变量k是提供位置信息,例如x要插入到y的左边,那这个k就代表了y的位置信息。而变量a则提供新插入的自行车的编号</span><span class="token punctuation">{</span> Node<span class="token punctuation">[</span>now<span class="token punctuation">]</span><span class="token punctuation">.</span>data<span class="token operator">=</span>a<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将新自行车的编号插入新结点的数据部分</span> locate<span class="token punctuation">[</span>a<span class="token punctuation">]</span><span class="token operator">=</span>now<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将新的自行车结点的下标存储在locate数组,便于快速查找</span> Node<span class="token punctuation">[</span>now<span class="token punctuation">]</span><span class="token punctuation">.</span>N<span class="token operator">=</span>Node<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>N<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将新结点的N(next)指向新结点右边的结点</span> Node<span class="token punctuation">[</span>Node<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>N<span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token operator">=</span>now<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将刚刚新节点的N指向的右边结点重新指回新结点,以构成双向链表,方便结点左右方向的任意插入</span> Node<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>N<span class="token operator">=</span>now<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将属于新节点左边的结点指向新结点</span> Node<span class="token punctuation">[</span>now<span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token operator">=</span>k<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//新节点的P(preid)指向其左结点。</span> now<span class="token operator">++</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//结点位置+1,便于下一个新结点的创建。</span><span class="token punctuation">}</span><span class="token comment" spellcheck="true">//这个代码需要结合思路部分的第二张图片去理解更佳</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p><strong>对于左右插入顺序的执行,在插入函数中最后的实现其实是偏右边的,比如k=0,那我们新的结点插入的位置是在0结点的右边的。右边插入我们解决了,接下来我们按照相对性的普遍规律,我们输入k=-1结点(这只是假设,假设0结点前面有一个-1结点),那结点就会插入到-1结点的右边,这不就相当于在结点0的左边嘛。这样我们左边插入和右边插入的问题就迎刃而解了</strong></p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"> <span class="token keyword">if</span><span class="token punctuation">(</span>z<span class="token operator">==</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">insert</span><span class="token punctuation">(</span>Node<span class="token punctuation">[</span>locate<span class="token punctuation">[</span>y<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token punctuation">,</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//插入到y的左边</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">insert</span><span class="token punctuation">(</span>locate<span class="token punctuation">[</span>y<span class="token punctuation">]</span><span class="token punctuation">,</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//插入到y的右边</span> <span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2><span id="yuan-dai-ma">源代码</span><a href="#yuan-dai-ma" class="header-anchor">#</a></h2><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"><iostream></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">const</span> <span class="token keyword">int</span> N<span class="token operator">=</span><span class="token number">120000</span><span class="token punctuation">;</span><span class="token keyword">int</span> now<span class="token punctuation">;</span><span class="token keyword">struct</span> Node<span class="token punctuation">{</span> <span class="token keyword">int</span> p<span class="token punctuation">;</span> <span class="token keyword">int</span> N<span class="token punctuation">;</span> <span class="token keyword">int</span> data<span class="token punctuation">;</span><span class="token punctuation">}</span>Node<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> locate<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> Node<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>N<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span> Node<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> now<span class="token operator">=</span><span class="token number">2</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">insert</span><span class="token punctuation">(</span><span class="token keyword">int</span> k<span class="token punctuation">,</span><span class="token keyword">int</span> a<span class="token punctuation">)</span><span class="token punctuation">{</span> Node<span class="token punctuation">[</span>now<span class="token punctuation">]</span><span class="token punctuation">.</span>data<span class="token operator">=</span>a<span class="token punctuation">;</span> locate<span class="token punctuation">[</span>a<span class="token punctuation">]</span><span class="token operator">=</span>now<span class="token punctuation">;</span> Node<span class="token punctuation">[</span>now<span class="token punctuation">]</span><span class="token punctuation">.</span>N<span class="token operator">=</span>Node<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>N<span class="token punctuation">;</span> Node<span class="token punctuation">[</span>Node<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>N<span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token operator">=</span>now<span class="token punctuation">;</span> Node<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>N<span class="token operator">=</span>now<span class="token punctuation">;</span> Node<span class="token punctuation">[</span>now<span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token operator">=</span>k<span class="token punctuation">;</span> now<span class="token operator">++</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> n<span class="token punctuation">,</span>x<span class="token punctuation">,</span>y<span class="token punctuation">,</span>z<span class="token punctuation">;</span> cin<span class="token operator">>></span>n<span class="token punctuation">;</span> <span class="token keyword">int</span> a<span class="token punctuation">;</span> cin<span class="token operator">>></span>a<span class="token punctuation">;</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">insert</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将第一辆自行车插入数据</span> n<span class="token operator">--</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//第一辆插入了之后总数量要减1</span> <span class="token keyword">while</span><span class="token punctuation">(</span>n<span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cin<span class="token operator">>></span>x<span class="token operator">>></span>y<span class="token operator">>></span>z<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>z<span class="token operator">==</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">insert</span><span class="token punctuation">(</span>Node<span class="token punctuation">[</span>locate<span class="token punctuation">[</span>y<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token punctuation">,</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">insert</span><span class="token punctuation">(</span>locate<span class="token punctuation">[</span>y<span class="token punctuation">]</span><span class="token punctuation">,</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span>Node<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>N<span class="token punctuation">;</span>i<span class="token operator">!=</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator">=</span>Node<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>N<span class="token punctuation">)</span> <span class="token punctuation">{</span> cout<span class="token operator"><<</span>Node<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>data<span class="token operator"><<</span><span class="token string">" "</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将结点的数据依次输出</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3><span id="c-stl-lian-biao-rong-qi-shi-xian-yuan-dai-ma">C++STL 链表容器实现源代码</span><a href="#c-stl-lian-biao-rong-qi-shi-xian-yuan-dai-ma" class="header-anchor">#</a></h3><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"><bits/stdc++.h></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> n<span class="token punctuation">,</span>x<span class="token punctuation">,</span>y<span class="token punctuation">,</span>z<span class="token punctuation">,</span>a<span class="token punctuation">;</span> list<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span><span class="token operator">::</span>iterator locate<span class="token punctuation">[</span><span class="token number">200000</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//用于定位自行车对应的结点位置</span> list<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> Node<span class="token punctuation">;</span> list<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span><span class="token operator">::</span>iterator temp<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//迭代器,只访问物体的外部信息,而不访问内部信息,可以看作指针,指针是迭代器的一种</span> cin<span class="token operator">>></span>n<span class="token operator">>></span>a<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//a是第一类自行车的编号,n是总共的自行车数量</span> Node<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将第一辆自行车的数据存入链表结点</span> locate<span class="token punctuation">[</span>a<span class="token punctuation">]</span><span class="token operator">=</span>Node<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将第一辆自行车的结点的位置信息存到locate 迭代器中,因为list容器访问的时候只能通过自增去一个一个查询,而不可以直接通过下标去访问。那样太慢了,我们直接通过存自行车编号对应的迭代器,可以直接定位到具体的结点位置,提高运行效率</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator"><=</span>n<span class="token number">-1</span><span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cin<span class="token operator">>></span>x<span class="token operator">>></span>y<span class="token operator">>></span>z<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>z<span class="token operator">==</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Node<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span>locate<span class="token punctuation">[</span>y<span class="token punctuation">]</span><span class="token punctuation">,</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将编号x的自行车插到y编号自行车的左边</span> temp<span class="token operator">=</span>locate<span class="token punctuation">[</span>y<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//存储y编号自行车的位置</span> locate<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token operator">=</span><span class="token operator">--</span>temp<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//temp位置是对应y自行车的,现在x编号的自行车已经在y自行车的前面了,所以只要将temp自减1,就是x对应的位置信息了</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> Node<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token operator">++</span>locate<span class="token punctuation">[</span>y<span class="token punctuation">]</span><span class="token punctuation">,</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将编号x的自行车插到y编号自行车的右边</span> temp<span class="token operator">=</span>locate<span class="token punctuation">[</span>y<span class="token punctuation">]</span><span class="token punctuation">;</span> locate<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token operator">=</span><span class="token operator">--</span>temp<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> temp<span class="token operator">=</span>Node<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span>temp<span class="token punctuation">;</span>temp<span class="token operator">!=</span>Node<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator">++</span>temp<span class="token punctuation">)</span><span class="token comment" spellcheck="true">//通过迭代器遍历输出结果</span> <span class="token punctuation">{</span> cout<span class="token operator"><<</span><span class="token operator">*</span>temp<span class="token operator"><<</span><span class="token string">" "</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2><span id="zong-jie">总结</span><a href="#zong-jie" class="header-anchor">#</a></h2><blockquote><p><strong>通过一locate数组/list迭代器 来存储位置信息,通过空间换时间可以用来解决链表遍历过慢的问题。本题核心的点在于利用双向链表,通过物体相对的位置关系去实现了左边插入和右边插入。</strong></p></blockquote>]]></content>
<tags>
<tag> 数据结构 </tag>
</tags>
</entry>
<entry>
<title>大数求阶乘/相加问题</title>
<link href="/posts/14155.html"/>
<url>/posts/14155.html</url>
<content type="html"><![CDATA[<h1><span id="da-shu-qiu-jie-cheng-xiang-jia-wen-ti">大数求阶乘/相加问题</span><a href="#da-shu-qiu-jie-cheng-xiang-jia-wen-ti" class="header-anchor">#</a></h1><h2><span id="da-shu-qiu-jie-cheng">大数求阶乘</span><a href="#da-shu-qiu-jie-cheng" class="header-anchor">#</a></h2><h3><span id="ti-mu-miao-shu">题目描述</span><a href="#ti-mu-miao-shu" class="header-anchor">#</a></h3><blockquote><p>题目描述<br>给定一个正整数 n,求出 n! 的值。<br><strong>输入描述</strong></p></blockquote><blockquote><p>输入一个正整数 n,n<=1000。</p></blockquote><blockquote><p><strong>输出描述</strong><br>输出 n! 。<br><strong>输入输出样例</strong></p><blockquote><p>示例<br>输入</p></blockquote><blockquote><blockquote><pre><code>10</code></pre></blockquote></blockquote></blockquote><blockquote><blockquote><p>输出</p><blockquote><pre><code>3628800</code></pre></blockquote></blockquote></blockquote><h3><span id="jie-ti-si-lu">解题思路</span><a href="#jie-ti-si-lu" class="header-anchor">#</a></h3><blockquote><p>刚看到这道题目的时候,我的内心:什么??求阶乘???这个简单,写一个采用递归的方法,递归不就完事了嘛。一分钟以后,我毫不犹豫点击提交,一看,就通过了俩测试点 (大哭.jpg)。既然出了问题,那就得先找出是什么原因导致的,题目说n<=1000。那我就拿n=1000去测试一下程序,一看数据结果是鸭蛋(0)。到这里基本上问题就明朗了,当n越来越大的时候,前几个小的数还可以正常输出,后面的大的数据所计算出来的阶乘值已经超过了定义的int类型的最大范围,导致结果溢出。n=1000的时候即使是long long 类型的数据类型也无法承受它的结果值。好家伙,突然感觉路就被堵死了,这咋办?既然问题是大的数据溢出造成的,那我们干脆就把这个大的数据存放进数组里面,这样就可以保证数据不溢出了。那新的问题又来了,这个大数被我们存进数组了,那我们怎么让它跟下一个数据进行相乘呢????好在天无绝人之路,小学学的竖式相乘的法则可以帮我们完美解决这个问题。接下来我们来介绍一下这个竖式相乘法则:</p><blockquote><p>直接放例子: 12×39916878</p></blockquote></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"> <span class="token number">12</span> <span class="token number">39916878</span> <span class="token comment" spellcheck="true">//第一步先将两个数对应的位数对齐(个位对个位,十位对十位......)</span> <span class="token number">96</span> <span class="token comment" spellcheck="true">//第二步接下来我们让大数的个位数8去乘12,可得到96</span> <span class="token number">84</span> <span class="token comment" spellcheck="true">//同理我们让大数的十位上的数7去乘12,可得到84</span> <span class="token number">96</span> <span class="token comment" spellcheck="true">//百位上的数也同理</span> <span class="token number">72</span> <span class="token comment" spellcheck="true">//千位上的数也同理</span> <span class="token number">12</span> <span class="token comment" spellcheck="true">//万位上的数也同理</span> <span class="token number">108</span> <span class="token comment" spellcheck="true">//十万位上的数也同理</span> <span class="token number">108</span> <span class="token comment" spellcheck="true">//百万位位上的数也同理</span> <span class="token number">36</span> <span class="token comment" spellcheck="true">//千万位上的数也同理</span> <span class="token number">479002536</span> <span class="token comment" spellcheck="true">//最后我们依次把这些数相加存入数组就可以得到结果了</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p><strong>这个竖式相乘法则就是解决我们本题的关键,看了上面的这个例子,相信你心中应该已经有点灵感了吧??如果没有也没关系,接下来我们用程序语言来实现这个算法</strong></p></blockquote><hr><blockquote><p> <strong>首先我们要初始化一个数组,记作Big_data;同时初始化当前数据每个位数上的数字,这里我们为了直观一点,将大数的个位数设置在数组下标1的位置,十位、百位…..则对应数组下标2、3……</strong></p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"> <span class="token keyword">int</span> Big_data<span class="token punctuation">[</span><span class="token number">10000</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">}</span> <span class="token keyword">int</span> n,i<span class="token punctuation">,</span>j<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//n用于所需阶乘的数据输入,i和j是为了下面的数据遍历</span> cin<span class="token operator">>></span>n<span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><blockquote><p><strong>接下来我们要进行第二步:将依次递增上去的较小数与大数的各个位进行相乘,将各个位数的结果存储在位数对应的数组中</strong></p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token keyword">for</span><span class="token punctuation">(</span>i<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator"><=</span>n<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span>j<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>j<span class="token operator"><=</span>last<span class="token punctuation">;</span>j<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Big_data<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">=</span>Big_data<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">*</span>i<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//这个操作是让每个 位数产生的乘积先临时存入数组中,以上面的数据为例子,个位数产生的乘积96将被存入数组下标1中,下标2将存入十位上产生的乘积84,以此类推。</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p><strong>第三步:每个位置上的乘积我们已经储存好了,接下来我们就要对这些存储好的数组数据进行相加处理了</strong></p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token keyword">for</span><span class="token punctuation">(</span>j<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>j<span class="token operator"><=</span>last<span class="token operator">||</span>Big_data<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">!=</span><span class="token number">0</span><span class="token punctuation">;</span>j<span class="token operator">++</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">//这里的Big_data[j]!=0是为了让两数相乘之后的最高位上的数据能够更新,本来我们相乘之前那个大数是个8位数,那我们j能遍历到的最高位也就是八,如果相乘的数结果是个9位数的话,那最高位就没办法添加进我们的最高位数组,所以这个Big_data[j]!=0就是为了当j==9的时候如果Big_data[9]不是0的话,说明新的大数是有九位数的,所以我们要进入这个条件,把第九位数据更新进Big_data数组</span><span class="token punctuation">{</span> Big_data<span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">=</span>Big_data<span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">+</span><span class="token punctuation">(</span>Big_data<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">/</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//以上面的个位和十位数举例子就是让96中的9和84去相加</span> Big_data<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">=</span>Big_data<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">%</span><span class="token number">10</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//更新大数每个位置上的数据,以上面的例子的个位数就是96的9已经加进84了,剩下的6就是我们个位数上剩的值了,那我们把6添加进Big_data[1],作为我们的个位。</span> <span class="token punctuation">}</span> last<span class="token operator">=</span>j<span class="token number">-1</span><span class="token comment" spellcheck="true">//更新这个大数的最高位数值</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p><strong>到这里数据已经被我们处理完成了,此时Big_data数组中下标1-last中已经存了我们这个大数的各个位数的数值,我们只要全部把他们输出了就可以得到我们这个大数的值了。</strong></p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span>last<span class="token punctuation">;</span>i<span class="token operator">></span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cout<span class="token operator"><<</span>Big_data<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//依次输出大数各个位数上的值</span> <span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><h3><span id="yuan-dai-ma">源代码</span><a href="#yuan-dai-ma" class="header-anchor">#</a></h3><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"><bits/stdc++.h></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> last<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">,</span>n<span class="token punctuation">,</span>j<span class="token punctuation">;</span> <span class="token keyword">int</span> Big_data<span class="token punctuation">[</span><span class="token number">10000</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span> cin<span class="token operator">>></span>n<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator"><=</span>n<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>j<span class="token operator"><=</span>last<span class="token punctuation">;</span>j<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Big_data<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">=</span>Big_data<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">*</span>i<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span> j<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>j<span class="token operator"><=</span>last<span class="token operator">||</span>Big_data<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">!=</span><span class="token number">0</span><span class="token punctuation">;</span>j<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Big_data<span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">=</span>Big_data<span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">+</span>Big_data<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">/</span><span class="token number">10</span><span class="token punctuation">;</span> Big_data<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">=</span>Big_data<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">%</span><span class="token number">10</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> last<span class="token operator">=</span>j<span class="token number">-1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span>last<span class="token punctuation">;</span>i<span class="token operator">></span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cout<span class="token operator"><<</span>Big_data<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//依次输出大数各个位数上的值</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2><span id="da-shu-xiang-jia-wen-ti">大数相加问题</span><a href="#da-shu-xiang-jia-wen-ti" class="header-anchor">#</a></h2><h3><span id="ti-mu-miao-shu">题目描述</span><a href="#ti-mu-miao-shu" class="header-anchor">#</a></h3><blockquote><p>输入两个整数 a 和 b,输出这两个整数的和。a 和 b 都不超过 100 位</p></blockquote><h3><span id="jie-ti-si-lu">解题思路</span><a href="#jie-ti-si-lu" class="header-anchor">#</a></h3><blockquote><p>本题解题的原理与上面的竖式乘法原理类似,让程序模拟竖式加法去运算即可。下面我来简单介绍一下竖式加分:</p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"> <span class="token number">89789</span><span class="token operator">+</span> <span class="token number">78979</span> <span class="token number">18</span> <span class="token number">15</span> <span class="token number">16</span> <span class="token number">17</span> <span class="token number">15</span><span class="token operator">=</span><span class="token number">168768</span> <span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p>第一题求大数阶乘的时候我们是从1开始逐次乘上去的,所以我们可以选择让个位数从数组的 下标1开始,而本题是直接通过输入两个大数,如果采用整数数组法,还需要去确认输入数据的位数,操作起来比较麻烦。所以本题我们代码部分采用另外一种字符串写法去执行:</p></blockquote><hr><blockquote><p><strong>首先我们先定义输入a,b,以及相加结果add_result的类型为字符串</strong></p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp">string add_result<span class="token punctuation">;</span> string a <span class="token punctuation">,</span>b<span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><blockquote><p><strong>接下来我们同样地从a,b两个字符串的末尾(大数的个位数)开始执行竖式加法原则,由于我们数据类型是字符类型的,所以数据的各个位数上对应的字符就要合理加减字符’0’去间接地转成整数,才可以让对应各个位数进行相加。我在源代码中引进了int c 整型变量用来临时存储位数相加之后的数据。然后我们可以通过对变量c的取余与字符’0’相加,我们就可以使各个位数上的结果还原成字符类型了。这样我们就可以解决字符之间相加的难题了。</strong></p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span>a<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span>j<span class="token operator">=</span>b<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator">>=</span><span class="token number">0</span><span class="token operator">||</span>j<span class="token operator">>=</span><span class="token number">0</span><span class="token operator">||</span>c<span class="token operator">!=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator">--</span><span class="token punctuation">,</span>j<span class="token operator">--</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">//从后往前遍历,相当于从个位数开始依次往前遍历,c!=0也是为了如果最高位有进位值的话,要更新最高位的数据</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>i<span class="token operator">>=</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">//如果a上面的位数有数据,则将该字符与字符'0'相减,得到差值(字符间接转整数),方便两个大数位数之间的相加</span> c<span class="token operator">+</span><span class="token operator">=</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token operator">-</span><span class="token string">'0'</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>j<span class="token operator">>=</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">//如果b上面的位数有数据,则将该字符与字符'0'相减,得到差值,(字符间接转整数),方便两个大数位数之间的相加</span> c<span class="token operator">+</span><span class="token operator">=</span>b<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">-</span><span class="token string">'0'</span><span class="token punctuation">;</span> add_result<span class="token operator">+</span><span class="token operator">=</span>c<span class="token operator">%</span><span class="token number">10</span><span class="token operator">+</span><span class="token string">'0'</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将相加后的得出的位数结果值还原成字符类型</span> c<span class="token operator">=</span>c<span class="token operator">/</span><span class="token number">10</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">// 进位值,加入到下一位的数据相加之中去</span> <span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p><strong>到这里我们add_result存储的结果其实是从个位开始然后到高位的,所以我们输出的时候要把这个字符串翻转一下再输出</strong></p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token function">reverse</span><span class="token punctuation">(</span>add_result<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>add_result<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将字符串add_result翻转过来</span> cout<span class="token operator"><<</span>add_result<span class="token operator"><<</span>endl<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//输出结果</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"><bits/stdc++.h></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> string add_result<span class="token punctuation">;</span> string a <span class="token punctuation">,</span>b<span class="token punctuation">;</span> <span class="token keyword">int</span> c<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> cin<span class="token operator">>></span>a<span class="token operator">>></span>b<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span>a<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span>j<span class="token operator">=</span>b<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator">>=</span><span class="token number">0</span><span class="token operator">||</span>j<span class="token operator">>=</span><span class="token number">0</span><span class="token operator">||</span>c<span class="token operator">!=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator">--</span><span class="token punctuation">,</span>j<span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>i<span class="token operator">>=</span><span class="token number">0</span><span class="token punctuation">)</span> c<span class="token operator">+</span><span class="token operator">=</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token operator">-</span><span class="token string">'0'</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>j<span class="token operator">>=</span><span class="token number">0</span><span class="token punctuation">)</span> c<span class="token operator">+</span><span class="token operator">=</span>b<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">-</span><span class="token string">'0'</span><span class="token punctuation">;</span> add_result<span class="token operator">+</span><span class="token operator">=</span>c<span class="token operator">%</span><span class="token number">10</span><span class="token operator">+</span><span class="token string">'0'</span><span class="token punctuation">;</span> c<span class="token operator">=</span>c<span class="token operator">/</span><span class="token number">10</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">reverse</span><span class="token punctuation">(</span>add_result<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>add_result<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> cout<span class="token operator"><<</span>add_result<span class="token operator"><<</span>endl<span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2><span id="zong-jie">总结</span><a href="#zong-jie" class="header-anchor">#</a></h2><blockquote><p><strong>这两道题目虽然代码的处理方式不一样,但是他们的原理都是基于竖着乘法(加法)法则来运行的,无论是加法还是乘法,我们都是要从个位开始操作,第一题求阶乘的时候我们是从1开始逐次乘上去的,相当于就是从个位数开始的,所以我们可以利用数组来从左向右依次存储大数的低位到高位的数据情况。最后输出的时候将各个位数数据反过来输出即可。而第二题两个大数相加,由于他们是通过键盘输入进来的数据,输入进来的位数从高到低是依次从左向右排列的。但是我们相加的过程毕竟还是要从个位数开始执行的,我们还要去确定两个大数的个位数的位置下标,比较繁琐。所以我们换了一种思路,通过将两个数定义成字符串类型,通过字符串的size()方法名,找到字符串的长度,然后从后往前遍历,且通过加减字符’0’,来间接实现对字符数据之间的相加减。最后将结果字符串翻转输出即可。</strong></p></blockquote>]]></content>
<tags>
<tag> 蓝桥杯 </tag>
<tag> 大数运算 </tag>
</tags>
</entry>
<entry>
<title>蓝桥杯小题杂记</title>
<link href="/posts/57854.html"/>
<url>/posts/57854.html</url>
<content type="html"><![CDATA[<h1><span id="lan-qiao-bei-xiao-ti-za-ji">蓝桥杯小题杂记</span><a href="#lan-qiao-bei-xiao-ti-za-ji" class="header-anchor">#</a></h1><h2><span id="ti-mu">题目①</span><a href="#ti-mu" class="header-anchor">#</a></h2><h3><span id="ti-mu-miao-shu">题目描述</span><a href="#ti-mu-miao-shu" class="header-anchor">#</a></h3><blockquote><p>本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。<br>如下的 10行数据,每行有 10 个整数,请你求出它们的乘积的末尾有多少个零?</p><p><strong>5650 4542 3554 473 946 4114 3871 9073 90 4329<br>2758 7949 6113 5659 5245 7432 3051 4434 6704 3594<br>9937 1173 6866 3397 4759 7557 3070 2287 1453 9899<br>1486 5722 3135 1170 4014 5510 5120 729 2880 9019<br>2049 698 4582 4346 4427 646 9742 7340 1230 7683<br>5693 7015 6887 7381 4172 4341 2909 2027 7355 5649<br>6701 6645 1671 5978 2704 9926 295 3125 3878 6785<br>2066 4247 4800 1578 6652 4616 1113 6205 3264 2915<br>3966 5291 2904 1285 2193 1428 2265 8730 9436 7074<br>689 5510 8243 6114 337 4096 8199 7313 3685 211</strong></p></blockquote><h3><span id="si-lu">思路</span><a href="#si-lu" class="header-anchor">#</a></h3><blockquote><p>题目说要求这100个数据的乘积有多少个零,如果我们直接将这些数据相乘,那将会是一个天文数字,肯定会超出数据类型的最大值。那怎么办?一种显而易见的方式是:分而治。首先:先将摆在明面上的数据有零的先提早进行计数,计数完之后将数据记完数的含零部分进行剔除。所有数据按照这种思路执行,直到遍历完成。 其次:根据两数相乘的法则,同时图中数据最大的位数是4位数,我们还可以在去除完多余的0数据之后只保留该数据(被乘数)的最后四位。因为乘数最大是四位数,与被乘数的有效乘积其实只有四位,所以我们完全可以去除该数据(被乘数)的冗余位数。至此我们就实现了在保证数据不超出类型的最大值的情况下完成了对总乘积值的零数据的计数。</p></blockquote><h3><span id="yuan-dai-ma">源代码</span><a href="#yuan-dai-ma" class="header-anchor">#</a></h3><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"><iostream></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span> <span class="token keyword">int</span> count<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//初始化全局计数变量count</span><span class="token keyword">int</span> <span class="token function">DivideZero</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">while</span><span class="token punctuation">(</span>i<span class="token operator">/</span><span class="token number">10</span><span class="token operator">!=</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">//遍历数据的每一个位数</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>i<span class="token operator">%</span><span class="token number">10</span><span class="token operator">==</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">//如果该位是0,则计数+1</span> <span class="token punctuation">{</span> count<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token comment" spellcheck="true">//如果该位数不是0,则直接返回这个数的值</span> <span class="token keyword">return</span> i<span class="token punctuation">;</span> i<span class="token operator">=</span>i<span class="token operator">/</span><span class="token number">10</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//去除判断完的位数</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> i<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//如果这个位数除了最高位之外都是0,只剩该最高位,则返回这个最高位的值</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">int</span> a<span class="token punctuation">[</span><span class="token number">103</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span> <span class="token number">5650</span><span class="token punctuation">,</span><span class="token number">4542</span><span class="token punctuation">,</span><span class="token number">3554</span><span class="token punctuation">,</span><span class="token number">473</span><span class="token punctuation">,</span><span class="token number">946</span><span class="token punctuation">,</span><span class="token number">4114</span><span class="token punctuation">,</span><span class="token number">3871</span><span class="token punctuation">,</span><span class="token number">9073</span><span class="token punctuation">,</span><span class="token number">90</span><span class="token punctuation">,</span><span class="token number">4329</span><span class="token punctuation">,</span> <span class="token number">2758</span><span class="token punctuation">,</span><span class="token number">7949</span><span class="token punctuation">,</span><span class="token number">6113</span><span class="token punctuation">,</span><span class="token number">5659</span><span class="token punctuation">,</span><span class="token number">5245</span><span class="token punctuation">,</span><span class="token number">7432</span><span class="token punctuation">,</span><span class="token number">3051</span><span class="token punctuation">,</span><span class="token number">4434</span><span class="token punctuation">,</span><span class="token number">6704</span><span class="token punctuation">,</span><span class="token number">3594</span><span class="token punctuation">,</span> <span class="token number">9937</span><span class="token punctuation">,</span><span class="token number">1173</span><span class="token punctuation">,</span><span class="token number">6866</span><span class="token punctuation">,</span><span class="token number">3397</span><span class="token punctuation">,</span><span class="token number">4759</span><span class="token punctuation">,</span><span class="token number">7557</span><span class="token punctuation">,</span><span class="token number">3070</span><span class="token punctuation">,</span><span class="token number">2287</span><span class="token punctuation">,</span><span class="token number">1453</span><span class="token punctuation">,</span><span class="token number">9899</span><span class="token punctuation">,</span> <span class="token number">1486</span><span class="token punctuation">,</span><span class="token number">5722</span><span class="token punctuation">,</span><span class="token number">3135</span><span class="token punctuation">,</span><span class="token number">1170</span><span class="token punctuation">,</span><span class="token number">4014</span><span class="token punctuation">,</span><span class="token number">5510</span><span class="token punctuation">,</span><span class="token number">5120</span><span class="token punctuation">,</span><span class="token number">729</span><span class="token punctuation">,</span><span class="token number">2880</span><span class="token punctuation">,</span><span class="token number">9019</span><span class="token punctuation">,</span> <span class="token number">2049</span><span class="token punctuation">,</span><span class="token number">698</span><span class="token punctuation">,</span><span class="token number">4582</span><span class="token punctuation">,</span><span class="token number">4346</span><span class="token punctuation">,</span><span class="token number">4427</span><span class="token punctuation">,</span><span class="token number">646</span><span class="token punctuation">,</span><span class="token number">9742</span><span class="token punctuation">,</span><span class="token number">7340</span><span class="token punctuation">,</span><span class="token number">1230</span><span class="token punctuation">,</span><span class="token number">7683</span><span class="token punctuation">,</span> <span class="token number">5693</span><span class="token punctuation">,</span><span class="token number">7015</span><span class="token punctuation">,</span><span class="token number">6887</span><span class="token punctuation">,</span><span class="token number">7381</span><span class="token punctuation">,</span><span class="token number">4172</span><span class="token punctuation">,</span><span class="token number">4341</span><span class="token punctuation">,</span><span class="token number">2909</span><span class="token punctuation">,</span><span class="token number">2027</span><span class="token punctuation">,</span><span class="token number">7355</span><span class="token punctuation">,</span><span class="token number">5649</span><span class="token punctuation">,</span> <span class="token number">6701</span><span class="token punctuation">,</span><span class="token number">6645</span><span class="token punctuation">,</span><span class="token number">1671</span><span class="token punctuation">,</span><span class="token number">5978</span><span class="token punctuation">,</span><span class="token number">2704</span><span class="token punctuation">,</span><span class="token number">9926</span><span class="token punctuation">,</span><span class="token number">295</span><span class="token punctuation">,</span><span class="token number">3125</span><span class="token punctuation">,</span><span class="token number">3878</span><span class="token punctuation">,</span><span class="token number">6785</span><span class="token punctuation">,</span> <span class="token number">2066</span><span class="token punctuation">,</span><span class="token number">4247</span><span class="token punctuation">,</span><span class="token number">4800</span><span class="token punctuation">,</span><span class="token number">1578</span><span class="token punctuation">,</span><span class="token number">6652</span><span class="token punctuation">,</span><span class="token number">4616</span><span class="token punctuation">,</span><span class="token number">1113</span><span class="token punctuation">,</span><span class="token number">6205</span><span class="token punctuation">,</span><span class="token number">3264</span><span class="token punctuation">,</span><span class="token number">2915</span><span class="token punctuation">,</span> <span class="token number">3966</span><span class="token punctuation">,</span><span class="token number">5291</span><span class="token punctuation">,</span><span class="token number">2904</span><span class="token punctuation">,</span><span class="token number">1285</span><span class="token punctuation">,</span><span class="token number">2193</span><span class="token punctuation">,</span><span class="token number">1428</span><span class="token punctuation">,</span><span class="token number">2265</span><span class="token punctuation">,</span><span class="token number">8730</span><span class="token punctuation">,</span><span class="token number">9436</span><span class="token punctuation">,</span><span class="token number">7074</span><span class="token punctuation">,</span> <span class="token number">689</span><span class="token punctuation">,</span><span class="token number">5510</span><span class="token punctuation">,</span><span class="token number">8243</span><span class="token punctuation">,</span><span class="token number">6114</span><span class="token punctuation">,</span><span class="token number">337</span><span class="token punctuation">,</span><span class="token number">4096</span><span class="token punctuation">,</span><span class="token number">8199</span><span class="token punctuation">,</span><span class="token number">7313</span><span class="token punctuation">,</span><span class="token number">3685</span><span class="token punctuation">,</span><span class="token number">211</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">int</span> temp<span class="token operator">=</span>a<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//temp临时存储第一个数据,方便用于与后面的数据进行相乘</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator"><</span><span class="token number">100</span><span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> temp<span class="token operator">*</span><span class="token operator">=</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//前后数据进行相乘</span> temp<span class="token operator">=</span><span class="token function">DivideZero</span><span class="token punctuation">(</span>temp<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//去除数据某位的连续的"0"</span> temp<span class="token operator">=</span>temp<span class="token operator">%</span><span class="token number">10000</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//保留数据的后四位,不干扰求末尾0数据总数的同时缩小数据的大小</span> <span class="token punctuation">}</span> cout<span class="token operator"><<</span>count<span class="token operator"><<</span>endl<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//输出总计数值</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2><span id="ti-mu">题目②</span><a href="#ti-mu" class="header-anchor">#</a></h2><blockquote><p><strong>题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小明对数位中含有 2、0、1、9的数字很感兴趣,在 1 到 40 中这样的数包括 1、2、9、10 至 32、39和 40,共 28 个,他们的和是 574,平方和是 14362。注意,平方和是指将每个数分别平方后求和。请问,在 1 到 2019 中,所有这样的数的平方和是多少?</strong></p></blockquote><h3><span id="si-lu">思路</span><a href="#si-lu" class="header-anchor">#</a></h3><blockquote><p>这道题看起来有点类似于题目一,也是对数字位数的特殊判断,但是本题需要我们判断的条件有点多,我们采用另外一种思路来操作,即我们将数字转换成字符串类型,再采用范围for语句对字符串的每个字符进行遍历,符合条件的我们就标记为true(1),如果不符合条件我们就标记为false(0)。然后我们再对符合条件的数据进行平方和处理即可。</p></blockquote><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"><bits/stdc++.h></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">long</span> <span class="token keyword">long</span> sum<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//初始化总平方和的变量sum,这里必须是long long 类型的,因为long long类型的数据范围是[-2^36,2^63-1],如果采用int类型,结果将溢出。</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator"><=</span><span class="token number">2019</span><span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> string s <span class="token operator">=</span> <span class="token function">to_string</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将数据i转换成字符串类型赋值给s</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">auto</span> j<span class="token operator">:</span> s<span class="token punctuation">)</span><span class="token comment" spellcheck="true">//采用范围for语句,对字符串s内的字符进行逐个遍历</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>j<span class="token operator">==</span><span class="token string">'2'</span><span class="token operator">||</span>j<span class="token operator">==</span><span class="token string">'0'</span><span class="token operator">||</span>j<span class="token operator">==</span><span class="token string">'1'</span><span class="token operator">||</span>j<span class="token operator">==</span><span class="token string">'9'</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">//判断是否有字符满足条件</span> <span class="token punctuation">{</span> sum<span class="token operator">+</span><span class="token operator">=</span><span class="token function">pow</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//若满足条件则直接计入总平方和的计数</span> <span class="token keyword">break</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//有一个字符满足条件了,说明该数字已经被判断好了,无需对剩余字符进行判断了,可以直接退出循环了</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> cout<span class="token operator"><<</span>sum<span class="token operator"><<</span>endl<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//输出总的平方和</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2><span id="ti-mu">题目③</span><a href="#ti-mu" class="header-anchor">#</a></h2><blockquote><p><strong>题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。给定数列 1,1,1,3,5,9,17,⋯从第 4 项开始,每项都是前 3 项的和。求第 20190324 项的最后 4 位数字</strong></p></blockquote><h3><span id="si-lu">思路</span><a href="#si-lu" class="header-anchor">#</a></h3><blockquote><p>这道题的核心问题其实就对数据过大的处理,其实解决方案和第一题是一模一样的,题目需要你求最后四位数字,那我们就通过取余去保留最后四位数字,又因为根据加法原则,最后四位数的相加和其余位上的数没有直接关联,所有我们直接通过取余去缩小数据的值,在不影响所求结果的情况下继续使数据以较小的值进行相加。这样就可以完美解决本题了</p></blockquote><h3><span id="yuan-dai-ma">源代码</span><a href="#yuan-dai-ma" class="header-anchor">#</a></h3><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"><iostream></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> a<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">,</span>b<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">,</span>c<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">,</span>temp<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//初始化最开始的前三位数</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">4</span><span class="token punctuation">;</span>i<span class="token operator"><=</span><span class="token number">20190324</span><span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">//从第四位开始变量,遍历过程是a,b,c每次整体向后移一位</span> <span class="token punctuation">{</span> temp<span class="token operator">=</span>c<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//c代表最新的要更新的那个值,由于最新的那个值是前三位的值之和,平移的同时c的原数据不应被覆盖,所以我们拿一个临时变量temp用来存储c变量的原数据</span> c<span class="token operator">=</span><span class="token punctuation">(</span>a<span class="token operator">+</span>b<span class="token operator">+</span>c<span class="token punctuation">)</span><span class="token operator">%</span><span class="token number">10000</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//把最新的值赋值给c,整除10000是为了缩小数据的值,保留最后四位</span> a<span class="token operator">=</span>b<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//将a数据向后平移一位,相当于把b的值赋给a</span> b<span class="token operator">=</span>temp<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//b数据也要向后平移一位,相当于要把c的原数据赋值给b</span> <span class="token punctuation">}</span> cout<span class="token operator"><<</span>c<span class="token operator"><<</span>endl<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//c是最新的那个所求值,输出c即可</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2><span id="zong-jie">总结</span><a href="#zong-jie" class="header-anchor">#</a></h2><blockquote><p><strong>这第一题和第二题其实都存在对数据位数上的条件判断,对此我们可以有两种处理方案。①:灵活运用整除和取余,来去除数据的位数或者取出指定位数,以此来解决位数的条件判断问题。②:我们可以将数字直接转换成字符串类型,然后应用范围for循环依次对字符串的各个位数进行条件判断。还有这两道题还有一个烦人的点就是数据溢出问题,无论是题目一的乘积还是题目二的求总平方和,它们的结果的数据都会很大,这时候呢,我们要么采用题目一的分而治方式:先将明显存在的0计数完,然后去除计数完的0,然后运用乘法原则,发现数据的有些位数其实根本影响不到本题的求解,于是直接利用取余运算,将冗余部分的位数去除。或者采用第二题的方式,直接将计数变量的类型定位 long long 类型以支持数据的正常输出。第三道题核心就是保留最后四位数以减少数据的溢出的可能性,原理其实和第一题差不多。</strong></p></blockquote>]]></content>
<tags>
<tag> 蓝桥杯 </tag>
</tags>
</entry>
<entry>
<title>蓝桥杯2020年省赛填空题(七段码)</title>
<link href="/posts/30495.html"/>
<url>/posts/30495.html</url>
<content type="html"><![CDATA[<h1><span id="lan-qiao-bei-qi-duan-ma-2020-nian-sheng-sai">蓝桥杯:七段码(2020 年省赛)</span><a href="#lan-qiao-bei-qi-duan-ma-2020-nian-sheng-sai" class="header-anchor">#</a></h1><p>小蓝要用七段码数码管来表示一种特殊的文字。</p><p><img src="https://img1.imgtp.com/2023/08/21/6lAHTPLZ.jpg"></p><p> 七段码上图给出了七段码数码管的一个图示,数码管中一共有7 段可以发光的二极管,<br> 分别标记为a, b, c, d, e, f, g。小蓝要选择一部分二极管(至少要有一个)发光来表达字符。<br> 在设计字符的表达时,要求所有发光的二极管是连成一片的。<br>例如:b 发光,其他二极管不发光可以用来表达一种字符。<br>例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。<br>例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。<br>例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。<br>请问,小蓝可以用七段码数码管表达多少种不同的字符?</p><h2><span id="wen-ti-fen-xi">问题分析</span><a href="#wen-ti-fen-xi" class="header-anchor">#</a></h2><h3><span id="wen-ti-jian-hua">问题简化</span><a href="#wen-ti-jian-hua" class="header-anchor">#</a></h3><blockquote><p><strong>根据题意所述,它需要我们求出能二极管能表达出的字符种类有多少个。那我们很容易就能想到这道题完全可以转换成求点到任意点的路径数量有多少的题目。但是由于a->b显示的图形和b->a显示出来的其实是一样的,所以最后的答案应该是路径的总数量/2</strong></p></blockquote><h3><span id="jie-jue-wen-ti">解决问题</span><a href="#jie-jue-wen-ti" class="header-anchor">#</a></h3><h4><span id="wen-ti-ti-chu">问题提出</span><a href="#wen-ti-ti-chu" class="header-anchor">#</a></h4><blockquote><p><strong>既然是搜索路径的题目,我们很容易就可以想到dfs深度优先遍历搜索算法,也就是选择任意一个点作为起始点,访问过的结点我们全部标记为True,随后不断进入子结点,直到碰到退出条件。dfs算法会对每个访问过的路径进行标记,标记过的结点则无法再次访问,这就导致了如果一个点到另外一个结点有两条路,dfs就只能优先遍历程序设置的那条路,另外一条路则不会被计算在内(如下演示图)</strong></p></blockquote><p><strong>正常的dfs遍历:</strong><br><img src="https://img1.imgtp.com/2023/08/21/DdRZJJeg.gif" alt="dfs"><br><strong>本题需要的遍历:</strong><br><img src="https://img1.imgtp.com/2023/08/21/bVTN4XtD.gif" alt="遍历"></p><h4><span id="jie-jue-fang-an">解决方案</span><a href="#jie-jue-fang-an" class="header-anchor">#</a></h4><blockquote><p>如上两个演示图,我们可以看到问题所在是dfs遇到返回条件返回的时候,遍历过的结点依旧被标记,这就导致了从B->D-E的路线,dfs其实是无法实现计算在内的。既然是标记结点的问题,那我们只要每一次遇到返回条件返回结点的时候把已经返回了的结点标记重置为False(未访问状态)不就可以完美解决本题了嘛,这就是基于DFS改编的<strong>回溯算法</strong>的雏形</p></blockquote><h3><span id="si-lu">思路</span><a href="#si-lu" class="header-anchor">#</a></h3><div id="flowchart-0" class="flow-chart"></div><h2><span id="he-xin-dai-ma-jiang-jie">核心代码讲解</span><a href="#he-xin-dai-ma-jiang-jie" class="header-anchor">#</a></h2><pre class="line-numbers language-xml"><code class="language-xml">void Backtracking(int i, int visit[], int *count) { for (int j = 0; j < 7; j++) /*依次从a(0),b(1),c(2),d(3),e(4),f(5),g(6)这七个二极管分别作为出发点进行遍历*/ { if (graph[i][j] == 1 && visit[j] == 0) //如果两个结点之间有连接且要访问的那个结点没有被访问过则满足条件 { visit[j]=1;//提前标记我们要进入的那个结点已经被我们访问了 dfs(j, visit, count);//进入新结点,从新结点的基础上继续搜索路径 ( *count)++;//回退的时候进行计数 visit[j] = 0;//将已经回退的那个结点访问标记重置为0 } }}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p><strong>这里有一个细节要注意:我们的count初始化进来是值是1,因为存在一种情况:如果结点走到无路可走,程序其实是从if判断语句那里直接退出的,根本就没有进入if语句内部。也就是说当前的路径没有被计数进去,所以我们要在初始化count的时候就让它天然的就是以1为起步。</strong></p></blockquote><pre class="line-numbers language-c++"><code class="language-c++">#include <iostream>using namespace std;int graph[7][7] = {//如果两个相邻的结点有连接,则标记为1,例如:(0,1),0->1有连接,那么我们的graph[0][1]=1,同时1->0也是有连接的,那我们的graph[1][0]=1 {1, 1, 0, 0, 0, 1, 0}, {1, 1, 1, 0, 0, 0, 1}, {0, 1, 1, 1, 0, 0, 1}, {0, 0, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 1, 1, 1}, {1, 0, 0, 0, 1, 1, 1}, {0, 1, 1, 0, 1, 1, 1}};void Backtracking(int i, int visit[], int *count) { for (int j = 0; j < 7; j++) { if (graph[i][j] == 1 && visit[j] == 0) { visit[j]=1; dfs(j, visit, count); ( *count)++; visit[j] = 0; } }}int main() { int count = 1;//将count变量用来计数 int visit[7] = {0};//初始化访问标记数组 Backtracking(0, visit, &count);//调用回溯函数 cout << count / 2 << endl;//输出种类数 return 0;}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></iostream></code></pre><script src="https://cdnjs.cloudflare.com/ajax/libs/raphael/2.2.7/raphael.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/flowchart/1.6.5/flowchart.min.js"></script><textarea id="flowchart-0-code" style="display: none">st=>start: 创建一个7×7的数组,用来存储结点的连接情况op=>operation: 自定义函数Backtracking用来遍历结点op1=>operation: 在Backtracking函数中改编DFS算法使之成为回溯算法,且符合条件后每次回退都进行路径数量的计数op2=>operation: 因为我们要求的是路径所显示的图形,比如从a->b显示的图形和b->a显示出来的其实是一样的,所以最后我们要求的图形种类应该是总路径/2end=>end: 输出总路径/2st->op->op1->op2->end</textarea><textarea id="flowchart-0-options" style="display: none">{"theme":"simple","scale":1,"line-width":2,"line-length":50,"text-margin":10,"font-size":12}</textarea><script> var code = document.getElementById("flowchart-0-code").value; var options = JSON.parse(decodeURIComponent(document.getElementById("flowchart-0-options").value)); var diagram = flowchart.parse(code); diagram.drawSVG("flowchart-0", options);</script>]]></content>
<tags>
<tag> 数据结构 </tag>
<tag> 蓝桥杯 </tag>
<tag> 回溯算法 </tag>
</tags>
</entry>
<entry>
<title>图的简单理解</title>
<link href="/posts/52729.html"/>
<url>/posts/52729.html</url>
<content type="html"><![CDATA[<h2><span id="tu">图</span><a href="#tu" class="header-anchor">#</a></h2><h3><span id="li-yong-shu-zu-gou-jian-tu">利用数组构建图</span><a href="#li-yong-shu-zu-gou-jian-tu" class="header-anchor">#</a></h3><h4><span id="wu-xiang-tu"><strong>无向图</strong></span><a href="#wu-xiang-tu" class="header-anchor">#</a></h4><pre class="line-numbers language-xml"><code class="language-xml">#include <bits/stdc++.h>using namespace std;typedef char VertexType;typedef int EdgeType;#define MAXVER 100#define INFINITY 65532typedef struct{ VertexType vexs[MAXVER]; EdgeType arc[MAXVER][MAXVER]; int numNodes,numEdges;}MGraph;void CreatMGraph(MGraph *G){ int i,j,k,w; cout<<"输入顶点数和边数:"<<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>endl;</span> <span class="token attr-name">cin</span><span class="token punctuation">></span></span>>G->numNodes>>G->numEdges; //录入顶点和边数量的信息 cout<<"请输入顶点的具体的值"<<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>endl;</span> <span class="token attr-name">for(i</span><span class="token attr-value"><span class="token punctuation">=</span>0;i<G-</span><span class="token punctuation">></span></span>numNodes;i++) { cin>>G->vexs[i]; } for(i=0;i<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>G-</span><span class="token punctuation">></span></span>numNodes;i++) { for(j=1;j<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>G-</span><span class="token punctuation">></span></span>numNodes;j++) { G->arc[i][j]=INFINITY; } } for(k=0;k<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>G-</span><span class="token punctuation">></span></span>numNodes;k++) { cout<<"输入边(vi,vj)的下标i,j,以及权重w"<<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>endl;</span> <span class="token attr-name">cin</span><span class="token punctuation">></span></span>>i>>j>>w; G->arc[i][j]=w;//输入权重值 G->arc[j][i]=w; }//无向图的矩阵对称}int main(){ MGraph G1;//创建一个空的G1无向图变量 CreatMGraph(&G1);//调用函数初始化G1}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3><span id="li-yong-lian-biao-lai-gou-zao-tu">利用链表来构造图</span><a href="#li-yong-lian-biao-lai-gou-zao-tu" class="header-anchor">#</a></h3><h4><span id="wu-xiang-tu"><strong>无向图</strong></span><a href="#wu-xiang-tu" class="header-anchor">#</a></h4><pre class="line-numbers language-xml"><code class="language-xml">#include <bits/stdc++.h>using namespace std;typedef char VertexType;typedef int EdgeType;#define MAXVEX 100#define INFINITY 65532typedef struct EdgeNode{ int adjvex;存储当前结点的位置 EdgeType weight;存储权值 struct EdgeNode *Next; 存储下一个指向的结点}EdgeNode; //构造出边表结点<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p>代码具象化:<br><img src="https://img1.imgtp.com/2023/08/20/PblUz2Ru.jpg" alt="构造出边表结点图"></p></blockquote><pre class="line-numbers language-xml"><code class="language-xml">typedef struct VertexNode{ VertexType data;//存储顶点的数值 EdgeNode *firstedge;//存储顶点指向的下一个结点}VertexNode,AdjList[MAXVEX];//构造出顶点列表<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p>代码具象化:<br><img src="https://img1.imgtp.com/2023/08/20/oNvo9jJN.jpg" alt="构造出顶点列表图"></p></blockquote><pre class="line-numbers language-xml"><code class="language-xml">typedef struct{ AdjList adjList; int numNodes,numEdges;}GraphAdjlist;void CreatMGraph(GraphAdjlist *G){ int i,j,k,w; EdgeNode *e;//定义一个边表 cout<<"输入顶点数和边数:"<<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>endl;</span> <span class="token attr-name">cin</span><span class="token punctuation">></span></span>>G->numNodes>>G->numEdges; for (int i=0; i<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>G-</span><span class="token punctuation">></span></span>numNodes ; ++i) { cin>>G->adjList[i].data;//初始化顶点表的data数值 G->adjList[i].firstedge=NULL;//初始化顶点表的firstedge的数值 } for(k=0;k<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>G-</span><span class="token punctuation">></span></span>numEdges;k++)// { cout<<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>"输入边(vi,vj)上的顶点序号";</span> <span class="token attr-name">cin</span><span class="token punctuation">></span></span>>i>>j; e=(EdgeNode *)malloc(sizeof(EdgeNode));//申请边表类型的一个临时内存 e->adjvex=j;//把j输入到边表结点的adjvex上,表达当前j的位置 e->Next=G->adjList[i].firstedge;//采用头插法将位置为j的边表结点插入到头节点i对应的下一个结点。 G->adjList[i].firstedge=e; <span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p>代码具象化:<br><img src="https://img1.imgtp.com/2023/08/20/XTAqW8FZ.jpg" alt="头插法"></p></blockquote><p><strong>因为是无向图,所以正反两面都要配置,上面是i->j的配置,下面的代码是j->i的配置</strong></p><pre class="line-numbers language-xml"><code class="language-xml"> e=(EdgeNode *)malloc(sizeof(EdgeNode)); e->adjvex=i; e->Next=G->adjList[j].firstedge; G->adjList[j].firstedge=e; } free(e);//释放申请malloc的动态内存}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h5><span id="wan-zheng-dai-ma">完整代码</span><a href="#wan-zheng-dai-ma" class="header-anchor">#</a></h5><pre class="line-numbers language-xml"><code class="language-xml">#include <bits/stdc++.h>using namespace std;typedef char VertexType;typedef int EdgeType;#define MAXVEX 100#define INFINITY 65532typedef struct EdgeNode{ int adjvex;存储当前结点的位置 EdgeType weight;存储权值 struct EdgeNode *Next; 存储下一个指向的结点}EdgeNode; //构造出边表结点typedef struct VertexNode{ VertexType data;//存储顶点的数值 EdgeNode *firstedge;//存储顶点指向的下一个结点}VertexNode,AdjList[MAXVEX];//构造出顶点列表typedef struct{ AdjList adjList; int numNodes,numEdges;}GraphAdjlist;void CreatMGraph(GraphAdjlist *G){ int i,j,k,w; EdgeNode *e;//定义一个边表 cout<<"输入顶点数和边数:"<<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>endl;</span> <span class="token attr-name">cin</span><span class="token punctuation">></span></span>>G->numNodes>>G->numEdges; for (int i=0; i<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>G-</span><span class="token punctuation">></span></span>numNodes ; ++i) { cin>>G->adjList[i].data;//初始化顶点表的data数值 G->adjList[i].firstedge=NULL;//初始化顶点表的firstedge的数值 } for(k=0;k<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>G-</span><span class="token punctuation">></span></span>numEdges;k++)// { cout<<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>"输入边(vi,vj)上的顶点序号";</span> <span class="token attr-name">cin</span><span class="token punctuation">></span></span>>i>>j; e=(EdgeNode *)malloc(sizeof(EdgeNode));//申请边表类型的一个临时内存 e->adjvex=j;//把j输入到边表结点的adjvex上,表达当前j的位置 e->Next=G->adjList[i].firstedge;//采用头插法将位置为j的边表结点插入到头节点i对应的下一个结点。 G->adjList[i].firstedge=e; e=(EdgeNode *)malloc(sizeof(EdgeNode)); e->adjvex=i; e->Next=G->adjList[j].firstedge; G->adjList[j].firstedge=e; } free(e);//释放申请malloc的动态内存}int main(){GraphAdjlist *G1; CreatMGraph(G1);}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>]]></content>
<tags>
<tag> 数据结构 </tag>
</tags>
</entry>
<entry>
<title>蓝桥杯2017年省赛填空题(统计出迷宫的人数)</title>
<link href="/posts/4571.html"/>
<url>/posts/4571.html</url>
<content type="html"><![CDATA[<h2><span id="lan-qiao-bei-2017-nian-sheng-sai-tian-kong-ti-mi-gong">蓝桥杯2017年省赛填空题:迷宫</span><a href="#lan-qiao-bei-2017-nian-sheng-sai-tian-kong-ti-mi-gong" class="header-anchor">#</a></h2><blockquote><p>题目描述:<br>本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。<br>X 星球的一处迷宫游乐场建在某个小山坡上。它是由 10×10 相互连通的小房间组成的。<br>房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立,则:</p><ul><li>L 表示走到左边的房间,</li><li>R 表示走到右边的房间,</li><li>U 表示走到上坡方向的房间,</li><li>D 表示走到下坡方向的房间。</li></ul></blockquote><blockquote><p>X 星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!<br>开始的时候,直升机把 100 名玩家放入一个个小房间内。玩家一定要按照地上的字母移动。<br>迷宫地图如下:<br>UDDLUULRUL<br>UURLLLRRRU<br>RRUURLDLRD<br>RUDDDDUUUU<br>URUDLLRRUU<br>DURLRLDLRL<br>ULLURLLRDU<br>RDLULLRDDD<br>UUDDUDUDLL<br>ULRDLUURRR<br>请你计算一下,最后,有多少玩家会走出迷宫,而不是在里边兜圈子?<br>如果你还没明白游戏规则,可以参看下面一个简化的 4x4 迷宫的解说图:<br><img src="https://img1.imgtp.com/2023/08/17/FEuRHtiB.jpg" alt="img"></p></blockquote><hr><h2><span id="zhi-shi-dian-chu-bei">知识点储备</span><a href="#zhi-shi-dian-chu-bei" class="header-anchor">#</a></h2><ul><li><strong>DFS深度优先遍历算法</strong></li><li><strong>树的前序遍历</strong></li><li><strong>递归</strong></li></ul><h3><span id="zhi-shi-dian-fu-xi">知识点复习</span><a href="#zhi-shi-dian-fu-xi" class="header-anchor">#</a></h3><h3><span id="shu-de-qian-xu-bian-li"><strong>树的前序遍历</strong>:</span><a href="#shu-de-qian-xu-bian-li" class="header-anchor">#</a></h3><h4><span id="kuai-su-gai-shu">快速概述</span><a href="#kuai-su-gai-shu" class="header-anchor">#</a></h4><blockquote><p>假如我们有如图所示的数据:<br><img src="https://img1.imgtp.com/2023/08/17/NWR3sFPX.jpg" alt="img"><br><strong>前置规定</strong>:我们规定把A作为根结点,且优先遍历左结点,直到左结点没有为止,然后再去走右结点,左右结点都遍历过了之后再回传到上一个父结点<br><strong>正式操作</strong>:我们从A结点开始出发,发现B和E结点两条路可以走,因为我们前置规定优先遍历左结点,所以走B结点,走到B结点发现左边没有结点可以走了,然后我们开始走B结点的右结点C,C结点之后按照同样的规定,我们依次遍历F、D 。走完D之后我们发现左右都没路了,我们开始回传到C结点、同样的F、D对结点于C来说是它的左右子结点, 我们已经遍历过了,于是C结点回传给B结点,同理B结点回传给A结点。对于A来说E结点还没遍历过,于是开始遍历E结点。E结点遍历之后按照同样的规则回传给A结点。至此,程序结束。</p></blockquote><hr><blockquote><p>文字描述看来很抽象,接下来我们直接放伪代码,来和文字结合理解一下。</p></blockquote><pre class="line-numbers language-c++"><code class="language-c++">struct Tree{ char data[2];//存储结点的名字 struct Tree *LeftNode;//存储结点左边的子节点 struct Tree *RightNode;//存储结点右边的子节点}*T;//创建树的结点T/*读入数据初始化结点T*/Void PreOrderTraverse(结点T){ if(T==NULL) //如果该结点是空的,就执行return直接退出当前自定义函数 return; print("%c",T->data);//打印当前结点的名字 PreOrderTraverse(T->LeftNode);//进入结点左边的子节点 PreOrderTraverse(T->RightNode);//进入结点右边的子节点}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h4><span id="zong-jie">总结</span><a href="#zong-jie" class="header-anchor">#</a></h4><blockquote><p>核心语句:</p></blockquote><pre class="line-numbers language-c++"><code class="language-c++"> print("%c",T->data);//打印当前结点的名字 PreOrderTraverse(T->LeftNode);//进入结点左边的子节点 PreOrderTraverse(T->RightNode);//进入结点右边的子节点<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><blockquote><p>其实前序遍历的本质就是一个递归算法。前序遍历的第一句是 <strong>print(“%c”,T->data);</strong> 直接打印当前结点的名字,第二句<strong>PreOrderTraverse(T->LeftNode);</strong> 的意思是不断地进入左边的子结点,直到结点为空。同理第三句<strong>PreOrderTraverse(T->RightNode);<strong>的意思是承接第二句执行后的结点,去遍历这个结点的右边子节点。有就打印,没有(或者遍历过)就返回这个结点的父节点。</strong>结束标准:A结点的右边子节点全部遍历完毕,返回到A结点,则判定程序结束。</strong></p></blockquote><h3><span id="dfs-shen-du-you-xian-bian-li-suan-fa">DFS深度优先遍历算法</span><a href="#dfs-shen-du-you-xian-bian-li-suan-fa" class="header-anchor">#</a></h3><blockquote><p>了解了树的前序遍历之后呢,我们就来介绍我们的重头戏<strong>DFS深度优先遍历算法</strong></p><blockquote><p>在此之前,我想提出一个问题:假如你现在处于一个迷宫里面,里面有7个房间,你想要去碰碰运气找遍所有房间,那你该怎么做?</p></blockquote><blockquote><p>我觉得大部分人的第一反应就是从某个房间出发,然后不断一个一个找过去,已经走过的,我们就标记一下,直到又回到了出发的那个房间为止。</p><blockquote><p><strong>这种方式就是DFS深度优先遍历算法的雏形</strong></p></blockquote></blockquote></blockquote><h4><span id="kuai-su-gai-shu">快速概述</span><a href="#kuai-su-gai-shu" class="header-anchor">#</a></h4><blockquote><p>假如我们有如下的数据<br><img src="https://img1.imgtp.com/2023/08/17/v5n6Efb3.jpg" alt="img"><br><strong>前置规定</strong>:我们可以随机选择一个结点作为根结点,且优先遍历左结点,(<strong>同时每走一个结点,我们用变量 visit 标记一下,表明我们走过这个结点了。</strong>)</p><blockquote><p><strong>回退结点的规则</strong>:<strong>若结点被visit标记了或者左右结点都不存在</strong></p></blockquote></blockquote><blockquote><p><strong>正式操作</strong>:我们从A结点开始出发,发现B和E结点两条路可以走,因为我们前置规定优先遍历左结点,所以走B结点,B结点左边是C结点,于是我们来到了C结点,同理C结点的的左边是F,F的左节点是G,G的左节点是E,E的左节点是A结点,但是A是我们走过的结点,已经用visit标记了,于是我们从A返回到E结点,继续执行E结点剩余的程序,显然E结点没有右子结点了,于是我们退回G结点,按照同样的规律,最后我们将退回结点到A结点,至此,程序结束。</p></blockquote><blockquote><blockquote><p><strong>看到这里,有没有发现DFS深度优先遍历算法其实就是前序遍历算法的变式呀,只不过DFS深度遍历算法增加了变量visit用来标记已经变量过的结点,以此来提早退回遍历过的结点。</strong></p></blockquote></blockquote><h4><span id="dai-ma-shi-xian">代码实现</span><a href="#dai-ma-shi-xian" class="header-anchor">#</a></h4><pre class="line-numbers language-c++"><code class="language-c++">struct Tree{ char data[2];//存储结点的名字 int vist=0;//规定visit=0还没有被遍历,visit=1,则已经被遍历 struct Tree *LeftNode;//存储结点左边的子节点 struct Tree *RightNode;//存储结点右边的子节点}*T;//创建树的结点T/*读入数据初始化结点T*/Void PreOrderTraverse(结点T){ if(T==NULL) //如果该结点是空的,就执行return直接退出当前自定义函数 return; if (visit==1)//如果当前结点已经被访问过了,那么直接退出当前自定义函数, return ; // 返回上一个结点 T->visit=1; //当前结点已经被遍历 print("%c",T->data);//打印当前结点的名字 PreOrderTraverse(T->LeftNode);//进入结点左边的子节点 PreOrderTraverse(T->RightNode);//进入结点右边的子节点}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h5><span id="xi-jie-jie-shi">细节解释</span><a href="#xi-jie-jie-shi" class="header-anchor">#</a></h5><p><img src="https://img1.imgtp.com/2023/08/17/v5n6Efb3.jpg" alt="img"></p><blockquote><p>假如我们已经从E执行到了A结点,此时我们发现A是已经被visit标记了的,源代码对应:</p></blockquote><pre class="line-numbers language-c++"><code class="language-c++">if (visit==1)//如果当前结点已经被访问过了,那么直接退出当前自定义函数, return; <span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><hr><blockquote><p>此时我们从A回退到E结点来执行E结点的剩余代码:<br><strong>PreOrderTraverse(T->RightNode);//进入结点右边的子节点</strong><br><strong>因为是回退结点,而不是对该结点的重头开始执行,所以从A结点回退到E结点的时候,对于E结点来说: PreOrderTraverse(T->LeftNode);已经执行完毕,所以我们只要执行它的下一行PreOrderTraverse(T->RightNode);即可。</strong></p></blockquote><hr><h2><span id="ti-mu-jiang-jie">题目讲解</span><a href="#ti-mu-jiang-jie" class="header-anchor">#</a></h2><blockquote><p>有了上面的知识储备之后, 我们回归题目本身</p></blockquote><h3><span id="si-lu">思路</span><a href="#si-lu" class="header-anchor">#</a></h3><div id="flowchart-0" class="flow-chart"></div><h3><span id="yuan-dai-ma">源代码</span><a href="#yuan-dai-ma" class="header-anchor">#</a></h3><pre class="line-numbers language-xml"><code class="language-xml">//#include <bits/stdc++.h>#include<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>iostream</span><span class="token punctuation">></span></span>#include<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>string.h</span><span class="token punctuation">></span></span>using namespace std;char Maps[10][10]={ 'U','D','D','L','U','U','L','R','U','L', 'U','U','R','L','L','L','R','R','R','U', 'R','R','U','U','R','L','D','L','R','D', 'R','U','D','D','D','D','U','U','U','U', 'U','R','U','D','L','L','R','R','U','U', 'D','U','R','L','R','L','D','L','R','L', 'U','L','L','U','R','L','L','R','D','U', 'R','D','L','U','L','L','R','D','D','D', 'U','U','D','D','U','D','U','D','L','L', 'U','L','R','D','L','U','U','R','R','R'};//初始化地图int visit[10][10];//创建visit变量void dfs(int i,int j,int*count) { if (i<0||i>9||j<0||j>9) { (*count)++;//人数+1。count我们传入的是指针,这样可以实现自定义外函数的count也在同步变化 return ;//过程中没有一次碰到走过的路,并且最后来到了地图边缘,此时我们可以判定出迷宫了 } else { if(visit[i][j]) { return ; }//假如走的时候发现这条路是走过的,说明是鬼打墙。就不需要继续走下去了,可以直接提早结束 visit[i][j]=1;//走过的块我们标记为1说明已经走过了 if (Maps[i][j]=='U') dfs(i-1,j,count);//当前方块是U的话就行数减一,向上走 else if (Maps[i][j]=='D')//当前方块是D的话行数加一,向下走 dfs(i+1,j,count); else if(Maps[i][j]=='L')//当前方块是L的话列数减一,向左走 dfs(i,j-1,count); else if (Maps[i][j]=='R')//当前方块是L的话列数加一,向右走 dfs(i,j+1,count); }}int main(){ int count=0;//初始化能够走出迷宫的人数 for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { memset(visit, 0, sizeof(visit));//memset是用来将visit里面的数组的值全部初始化为0 dfs(i,j,&count); }//通过两个for循环嵌套去逐个对每个方格进行dfs遍历搜寻判断 } cout<<count<<endl;//输出count即可}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>思路借鉴:<a href="https://blog.csdn.net/SakuraZhangrx/article/details/106922392">https://blog.csdn.net/SakuraZhangrx/article/details/106922392</a><script src="https://cdnjs.cloudflare.com/ajax/libs/raphael/2.2.7/raphael.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/flowchart/1.6.5/flowchart.min.js"></script><textarea id="flowchart-0-code" style="display: none">st=>start: 用数组初始化10×10的地图op=>operation: 命名一个自定义函数为dfs(),其中dfs中正常能够出地图的,我们采用count变量+1来统计op1=>operation: 主程序中我们使用嵌套for循环依次对地图的每一块依次变量e=>end: 输出countst->op->op1->e</textarea><textarea id="flowchart-0-options" style="display: none">{"theme":"simple","scale":1,"line-width":2,"line-length":50,"text-margin":10,"font-size":12}</textarea><script> var code = document.getElementById("flowchart-0-code").value; var options = JSON.parse(decodeURIComponent(document.getElementById("flowchart-0-options").value)); var diagram = flowchart.parse(code); diagram.drawSVG("flowchart-0", options);</script></p>]]></content>
<tags>
<tag> 数据结构 </tag>
<tag> 蓝桥杯 </tag>
</tags>
</entry>
<entry>
<title>数据结构笔记(一):算法复杂度(基础篇)</title>
<link href="/posts/14731.html"/>
<url>/posts/14731.html</url>
<content type="html"><![CDATA[<h2><span id="suan-fa-fu-za-du-fen-xi-jian-yao-gai-gua">算法复杂度分析简要概括</span><a href="#suan-fa-fu-za-du-fen-xi-jian-yao-gai-gua" class="header-anchor">#</a></h2><p><strong>算法复杂度</strong></p><ul><li><strong>时间复杂度</strong></li><li><strong>空间复杂度</strong></li></ul><hr><blockquote><p>时间复杂度的简单理解:进行算法分析时,我们假设每行的每次执行时间是t,n是某个循环的中止值。随后我们统计下所有行的代码执行次数,记作f(n),那么我们整个的程序的总的执行时间T为:f(n)×t。根据T函数我们可以看出T与f(n)成正比。此时我们就可以根据f(n)的函数增长率去估算时间复杂度,<strong>这里我们需要注意的是,我们只关注函数的增长率,而不关注n究竟是多大。</strong></p></blockquote><h2><span id="tui-dao-fang-fa-jie-shao">推导方法介绍</span><a href="#tui-dao-fang-fa-jie-shao" class="header-anchor">#</a></h2><h3><span id="tui-dao-liu-cheng">推导流程</span><a href="#tui-dao-liu-cheng" class="header-anchor">#</a></h3><div id="flowchart-0" class="flow-chart"></div><p><strong>核心:只关注推导出来的函数的最高阶项的阶数</strong></p><h3><span id="ju-ge-li-zi">举个栗子</span><a href="#ju-ge-li-zi" class="header-anchor">#</a></h3><pre class="line-numbers language-cpp"><code class="language-cpp"><span class="token keyword">int</span> count<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span>n<span class="token operator">=</span><span class="token number">100</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//执行1次</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator"><</span>n<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">//执行n+1次</span><span class="token punctuation">{</span> count<span class="token operator">++</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//执行n次</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p>根据注释可推出总次数的函数式f(n)=1+n+1+n=2n+2</p></blockquote><p><strong>化简原则:</strong></p><ul><li><strong>①函数如果是一个常数,不管多大,全用1代替,记作O(1)</strong></li><li><strong>②函数只保留最高阶项,若最高阶项的系数是常数,则统一用1代替,否则保留系数</strong></li></ul><blockquote><p>本题根据化简原则②可以将f(n)=2n+2,记作f(n)=n,即O(n),这就是我们这段程序的时间复杂度</p></blockquote><h3><span id="yi-wen">疑问</span><a href="#yi-wen" class="header-anchor">#</a></h3><blockquote><p>Q1:刚学的时候,关于这道例子我是有一个问题的,那就是n明明在一开始的时候就定义了n=100。那n不应该是一个常数吗?我的函数式不应该写成1+100+1+100=202吗?时间复杂度应该是O(1)而不是O(n)呀</p></blockquote><hr><blockquote><p>A1:我认为时间复杂度的理解应该是基于过程而言的,而不是基于结果的。基于结果,整个n肯定是一个有结果的值,我们可以看作它是一个基于常数时间复杂度的算法。但是当我们谈论时间复杂度时,我们通常会假设 n 是一个变量,它可以取任意值。这样我们就可以分析算法的运行时间随着输入数据规模的增长而增长的速度。</p><p>回到上面的问题,f(n)=2n+2,我们说n=100的时候,我们从结果的角度看,的确它可以叫做O(1)的时间复杂度,但是n是可以变化的,n可以是1,2,3……10000等等。也就是说我们是不只研究单单n=100这一个例子。我们研究的是一整个关于f(n)函数的增长变化情况的全局,本题的例子中这个f(n)的变化明显是类似于线性的变化,于是我们根据化简原则,可以得出时间复杂度是O(n),而不是O(1)<br><img src="https://img1.imgtp.com/2023/08/16/2LRqrNWv.png" alt="img"></p></blockquote><h3><span id="zong-jie">总结</span><a href="#zong-jie" class="header-anchor">#</a></h3><blockquote><p><strong>算法的复杂度是基于过程的而非单一的结果,根据循环的规律去写出次数对应的函数是关键,因为我们研究的是函数的整体变化速率。最后,根据化简原则,我们将函数化简之后得到的表达式就是我们需要的时间复杂度O()</strong><script src="https://cdnjs.cloudflare.com/ajax/libs/raphael/2.2.7/raphael.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/flowchart/1.6.5/flowchart.min.js"></script><textarea id="flowchart-0-code" style="display: none">st=>start: 列出各行代码的执行次数op=>operation: 统计总次数并且写成函数式子op1=>operation: 对函数式子进行化简处理e=>end: 分析结果st->op->op1->e</textarea><textarea id="flowchart-0-options" style="display: none">{"theme":"simple","scale":1,"line-width":2,"line-length":50,"text-margin":10,"font-size":12}</textarea><script> var code = document.getElementById("flowchart-0-code").value; var options = JSON.parse(decodeURIComponent(document.getElementById("flowchart-0-options").value)); var diagram = flowchart.parse(code); diagram.drawSVG("flowchart-0", options);</script></p></blockquote>]]></content>
<tags>
<tag> 数据结构 </tag>
</tags>
</entry>
<entry>
<title>前言</title>
<link href="/posts/53790.html"/>
<url>/posts/53790.html</url>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="密码不对,再猜猜看哦" data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="de20ada64d45e167730ca27b47035878f90521d734bd5fc0800411b02677437f">b73bd50429e4d350727cbeb8853cc6e01370542e623e305232d186e04af4e956df389a6edebda500d4a6712dc0b98f9409d6a7277845de7cc7f479225ad268e4ab752c764786fc88e4ad5a74885d07a147784a906a12ff8a59ee3d1e55cc3c29070ae1b9cf284a973cd36aff7fb34e12c2b4237fabeeec1c0e07aa198bc48ceabddc15acdf5503faab122893782f96c0094f33a021bfc6628849d4f0be4f188039678e57529e532d08fc1c48a515fece4890ac794ce627c98fc185a44c351a66923555f935a5141d7ef9c3d05ba7b9cd349f26d200c074fd04f7b20f8cc695b5ce0a7504f82bc8adcfe6777f3183bf6a5e102909c18ab2188701f146a084ba25cf4d4ed8c1bd166ecedc53951196aa4115bd619a440dcfe7fbc9dee447093fcff5b8e11926bbcda21b6e011533cd0579588b11a1cd4d340c111cab869f15064f3108d2ec8a92e22bc45184a12f08abc9ab4aa67f3e3d772fe64d809d6f411a3db127e49ae700b9e965f3b539aa03e11ca554960a9bd540e901a562a6e276760d604f5c60a064095f69d6bfe09a1acf18af29332a0ff1eb0b7805146d9217e3da5b584d91b3f22cc5936fad0ac04b99ac0c3504ff998e4d084d6492d7217a769372103e9dbc91f3e41ac66e5e735d0c8da38bdaa3d25f16f1f0f6d887bbc62ab298170c552e6853969d44910312c290941dc6e9a2beaa7935905027c56d1238c5aa62b04296f651f77716a124fa932da309c3f0415711870950f02b58da491d2d316049087d9e2ec16ac0a3bcca8f22235abf777c036c9e2e71ab2f7843084d2af598788aa2b10baa00fec2a726b9981542628ad83525696570a7012c9f0912cc1e5a1640f37ba90490bdb573037a7a1fc683b1888963075c3db3af70dbf0da18b5d60b6f832f00b49dad7940c0cc5b41b2dfcf46a39271952a596ed88489585588478e3130b24bb21cec41af886bf03ca670ca70b077ccd19185f8d6521856124715c89b217fa57965313cf6f5383fe62e4b0e46bec1b973b89bce7b41073d660304585155befe8cccb53714826779bb6487b37d4e40f5cc7518e4978cd73c7cc7bec7ba15d133f4608351137943e2254667bda804f183842430e528e272935981cd25a569010fda4fdb5ed313c14c088f3d4622bae232f85c5d2e03c2370e1d57b471673aba3e89b701501e38de16155eb16d963e94b81f0b49b5c2992f802225e3c7e67e2e8860006c4dca17d0fd1b8f85f41c93c613b7fa26c1f8d122271f42f27e5a4ee3edfaa2c55b5daca0a55b8687259d963e3c0c5d514f9efac53a5bfa61dfea81e6a191f52773f2e2a996eb63aff7e38f91113fee83403fef7b4206b85fea9d98a4194ddda6f234d4904cd16ad000293310ca250c479b9ad08b0bd7c13c6e9f643af33d60a5f9ed7f429d3b9c1215eb105d3cd427fe80cf5f815841901b305c3e89779ab9043afa2c8a1d64543e42dfa0c78b01af0f6a63c4b4c29be8f1c73f436448bca5bb136ef8eed3edf70c4499200dcc4c745d5e341c94883a15943b5206c5d8793cdee3cb68add68bf86b7f37f92cb46e7bc0ad8e0da810af326c6f31f662ad1ef5b178effe23b21cb8c90de0f0df30150a15b066e26a90744ab0285d417e53af844f00a6e1987ec8972ca61d7706c03e38c4afcf0d482fe0f6e37eaf167bb9a50e1274be8ff7d459ffde2e5b168d1995127beb831dad28814e8c7de8bbc375f716995a2d854936421c9b029d985b2e0cf4e1c195b278e62e63ce57c86ccadfc9ce8c878507e762ce32f2e28d0fe1d1eca30df2478e8896631dd192172eab6d031ee61d9956a5190f9ef2c78b2689b65b5f654e1b2357f56e742da60e83fc770874c6d6d9ad73ccec27901fd37029def798d76633cb1594350001c1dabaf44c55476c14ec5b591681034dbb033527f3300ea1f58c8a9796e5f0c538afda99661e67efceb188fb61886f67bf16872192088e356a62dcb1afe4ea80bea24ad68caf683f681de2c8bb65516e79268e2e4b8c62b4384bb1725c3a6f4acfd8f4e5baba59759f4c921c6361e4370a2622dfd72a4c1f8ddff49a38127d843ce9ef83048bb326c8a8c4db92d1a515746adf2f470d058393f0d2a2f5ba215c2d987c931e4c0cd496dcd9aa084ef71a8e6427de5ba87220c12fa8ca74cc100ec8fae736394143f13e7f626265c65482f11213821550d6655a7a1d7ab0125db01635927b9ce9fba300054c352e1dc47f0c273d87172994cf5e15f80e78ea958fcfbd739c4e0be324674abafcec7255140a01f90f2c23b0cfdfa2a2bfa8b64b8d9ecf4fc650cf664e4ac680316efc04bb61a9fc2a18849b2cea57fcfb81bfa1c95d7a8a3a5e4ded32c657a033bb464ade521c16fd61f7b2de7529dd470b12f59a6cb3d3ebce522e30237aec819f9533873c7d50b2dc4a7fd24853bbb67df7dc50120236fc8308e428e85710f27a47493dccd9c40d71b58a5f54f1ba0d7d8aee43dcd1f5519f96c79ef291750f009fc61eb1f293d72847240fc34f0d981e6e9304fb3f7a7673909a20282ec7c90fec365cd95e9f6aeb7bbcb8e784fe2f3edc359dca7df40ddb48c2d39e617b7034c77dc76ee57865e0be1d8741fea612c8ccbfb2ba595f4620971c4bec3a393fbf49fadf7c98b5ef52a44b9f40a995ba71e83b72b01c9ae6f0c1115fae0c26e1fd9d7cbd5979932f54826b4ce96382bcc4a9</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<tags>
<tag> 前言 </tag>
</tags>
</entry>
</search>