




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
程序設(shè)計(jì)實(shí)習(xí)第十講習(xí)題評(píng)講本講內(nèi)容課后作業(yè)難點(diǎn)題目(2道)
2009年期中考試題(2道)課后作業(yè)其他題目(6道)周末上機(jī)作業(yè)選講(1道)g,f不是反函數(shù)。例如k=2,原木是3,7。POJ2774:木材加工——?jiǎng)討B(tài)規(guī)劃解法木材廠有N根原木,它們的長(zhǎng)度分別是一個(gè)整數(shù).現(xiàn)在想把這些木頭切割成K根長(zhǎng)度相同的小段木頭.小段木頭的長(zhǎng)度要求是正整數(shù).請(qǐng)計(jì)算能夠得到的小段木頭的最大長(zhǎng)度定義函數(shù)f(x):要切割得到x根木頭時(shí),所能夠獲得的最大長(zhǎng)度定義函數(shù)g(l):從原木中最多可以切割得到g(l)個(gè)長(zhǎng)為l的木頭則f單調(diào)減,g單調(diào)減。(為什么?f,g是互為反函數(shù)嗎?)(注意g函數(shù)的單調(diào)性是二分法的基礎(chǔ),即求最大的x,使得g(x)=K。)k->len->maxK->maxRest要切割出k段->len=f(k)->
maxK
=
g(len)->切完maxK根長(zhǎng)len的木頭后剩下最長(zhǎng)木頭的長(zhǎng)度是maxRest其中有maxRest<len成立。(為什么?)int
sourceBar[N]:存儲(chǔ)N根原木的長(zhǎng)度objectBar[K]:結(jié)構(gòu)體objectBar[i]的含義如下len;要切割得到i根木頭時(shí),所能夠獲得的木頭的最大長(zhǎng)度maxK;切割成長(zhǎng)度為len的木頭時(shí),可切得的最大木頭數(shù)量MaxRest;切割成maxK根長(zhǎng)度為len的木頭后,剩余原木的最大長(zhǎng)度注意,先確定len,再確定maxK,最后確定MaxRest。total:切割前N根原木的長(zhǎng)度總和特殊情況:K>total:無(wú)法切割int
partition(
int
k)k==1:終態(tài),objectBar[1].len為切割前最長(zhǎng)原木的長(zhǎng)度objectBar[1].maxK為長(zhǎng)度為len的原木個(gè)數(shù)objectBar[1].MaxRest為長(zhǎng)度小于len的最長(zhǎng)原木長(zhǎng)度objectBar[k-1].maxK=0:遞歸過(guò)程partition(k-1)objectBar[k-1].maxK>=k:objectBar
[k]與objectBar
[k-1]相同
objectBar[k-1].maxK<k:確定len:objectBara[k].len
[objectBar[k-1].MaxRest,
objectBar[k-1].le哪個(gè)長(zhǎng)度len能夠使得objectBar[k].maxK
k?(也就是g(len)>=k)不要忘了計(jì)算objectBar[k].MaxRest木材加工參考程序#include
<iostream>#include
<algorithm>using
namespace
std;const
int
MAX
=
10005;int
srcLen[MAX];//原始木頭長(zhǎng)度int
N,K,tot;struct{int
len;
int
maxK;int
maxrest;}objectBar[MAX];void
solve(){if(tot
<
K){//特殊情況特殊判斷printf("0\n");return;}int
i,j,k,cnt,rest;//對(duì)遞推開(kāi)始狀態(tài)初始化for(i
=
N;
i
>=
1
&&
srcLen[i]
==
srcLen[N];i--);objectBar[1].len
=
srcLen[N];objectBar[1].maxK
=
N
-
i;objectBar[1].maxrest
=
srcLen[i];//開(kāi)始遞推//開(kāi)始遞推for(k
=
2;
k
<=
K;
k++){if(objectBar[k
-
1].maxK
>=
k){objectBar[k].len
=
objectBar[k
-1].len;objectBar[k].maxK
=
objectBar[k
-1].maxK;objectBar[k].maxrest
=
objectBar[k-
1].maxrest;}else{for(j
=
objectBar[k
-
1].len
-
1;
j
>=
objectBar[k
-1].maxrest
&&
j
>=
1;
j--){//枚舉可能長(zhǎng)度jcnt=0,rest=0;for(i=N;i>=1;i--){//計(jì)算最多可以切出多少個(gè)長(zhǎng)度為j的木頭if(srcLen[i]
>=
j){cnt
+=
srcLen[i]
/
j;rest
=
rest
>
(srcLen[i]
%
j)
?
rest
:
(srcLen[i]
%j);}else{rest
=
rest
>
srcLen[i]
?
rest
:
srcLen[i];break;}}if(cnt
>=
k)
break;}objectBar[k].len
=
j;objectBar[k].maxK
=
cnt;objectBar[k].maxrest
=
rest;}}printf("%d\n",objectBar[K].len);}int
main(){freopen("f.txt","r",stdin);scanf("%d%d",&N,&K);tot
=
0;for(int
i
=
1;
i
<=
N;
i
++){scanf("%d",&srcLen[i]);tot
+=
srcLen[i];}sort(srcLen,srcLen
+
N
+
1);solve();return
0;}3+(6–2)/4,5/(5-1/5)的語(yǔ)法樹(shù)是什么?POJ2787:算24poj2787算24給出4個(gè)小于10個(gè)正整數(shù),你可以使用加減乘除4種運(yùn)算以
及括號(hào)把這4個(gè)數(shù)連接起來(lái)得到一個(gè)表達(dá)式。現(xiàn)在的問(wèn)題是,是否存在一種方式使得得到的表達(dá)式的結(jié)果等于24每一種可能的計(jì)算方式都對(duì)應(yīng)一棵語(yǔ)法樹(shù)。比如a*(b+c)。本題只有4個(gè)數(shù)、4中運(yùn)算,因此可以通過(guò)窮舉搜索全部可能的語(yǔ)法樹(shù)(因而窮舉了全部可能表達(dá)式)來(lái)尋找24。窮舉搜索的方法是,從語(yǔ)法樹(shù)的樹(shù)葉開(kāi)始往上形成語(yǔ)法樹(shù),即自底向上的構(gòu)建語(yǔ)法樹(shù)。具體的說(shuō),對(duì)當(dāng)前的n(>1)個(gè)數(shù),任意取2個(gè)數(shù)x,y(共有
C(n,2)種),然后枚舉它們之間的6種可能運(yùn)算:x
+
y
,
x
–
y
,
y
–
x,
x
*
y
,x
/
y
(y
≠
0),
y
/
x
(x
≠
0
)設(shè)z為x,y運(yùn)算的結(jié)果,那么用z替代原來(lái)的x,y,n個(gè)數(shù)就變成為了n–1個(gè)數(shù)。遞歸進(jìn)行這個(gè)過(guò)程,直到n=1。#include
<stdio.h>#define
up
24.00001#define
down
23.99999bool
is(int
n);double
a[5][4];//a[i]用于存放求解i個(gè)數(shù)時(shí)的各數(shù)int
main(){while(scanf("%lf
%lf
%lf
%lf",
&a[4][0],&a[4][1],
&a[4][2],
&a[4][3])
&&
a[4][0]!=0){if
(is(4))
printf("YES\n");else
printf("NO\n");}}bool
is(int
n){if
(n
==
1)return
(a[1][0]
<
up
&&
a[1][0]
>down);//到達(dá)終止條件,判斷是否找到24double
*
pa
=
a[n];double
*
pb
=
a[n-1];for
(int
i=0;
i<n;
i++){for
(int
j=i+1;
j<n;
j++){//將除了pa[i],pa[j]以外的復(fù)制給下層函數(shù)。int
iter=0;for
(int
temp=0;
temp<n;
temp++){if
(temp!=i
&&
temp!=j){pb[iter]
=
pa[temp];iter++;}}//窮舉對(duì)i、j的運(yùn)算pb[n-2]=pa[i]+pa[j];//加法if
(is(n-1))return
true;pb[n-2]=pa[i]-pa[j];//減法if
(is(n-1))return
true;pb[n-2]=pa[j]-pa[i];//減法if
(is(n-1))
return
true;pb[n-2]=pa[i]*
pa[j];//乘法if
(is(n-1))return
true;if
(pa[j]!=0)//除法{pb[n-2]
=
pa[i]
/
pa[j];if
(is(n-1))
return
true;}if
(pa[i]!=0)//除法{pb[n-2]
=
pa[j]
/
pa[i];if
(is(n-1))
return
true;}}}return
false;}2009年期中試題:POJ3726仙島求藥Description:少年李逍遙的嬸嬸病了,王小虎介紹他去一趟仙靈島,向仙女姐姐要仙丹救嬸嬸。叛逆但孝順的李逍遙闖進(jìn)了仙靈島,克服了千險(xiǎn)萬(wàn)難來(lái)到島的中心,發(fā)現(xiàn)仙藥擺在了迷陣的深處。迷陣由M×N個(gè)方格組成,有的方格內(nèi)有可以瞬秒李逍遙的怪物,而有的方格內(nèi)則是安全。現(xiàn)在李逍遙想盡快找到仙藥,顯然他應(yīng)避開(kāi)有怪物的方格,并經(jīng)過(guò)最少的方格,而且那里會(huì)有神秘人物等待著他。現(xiàn)在要求你來(lái)幫助他實(shí)現(xiàn)這個(gè)目標(biāo)。圖-1顯示了一個(gè)迷陣的樣例及李逍遙找到仙藥的路線(xiàn).Input:輸入有多組測(cè)試數(shù)據(jù).每組測(cè)試數(shù)據(jù)以?xún)蓚€(gè)非零整數(shù)M
和N
開(kāi)始,兩者均不大于20。M
表示迷陣行數(shù),N
表示迷陣列數(shù)。接下來(lái)有M
行,每行包含N個(gè)字符,不同字符分別代表不同含義:‘@’:少年李逍遙所在的位置;‘.’:可以安全通行的方格;‘#’:有怪物的方格;‘*’:仙藥所在位置。當(dāng)在一行中讀入的是兩個(gè)零時(shí),表示輸入結(jié)束。Output:對(duì)于每組測(cè)試數(shù)據(jù),分別輸出一行,該行包含李逍遙找到仙藥需要穿過(guò)的最少的方格數(shù)目(計(jì)數(shù)包括初始位置的方塊)。如果他不可能找到仙藥,則輸出-1。Sample
Input:8
8.@##...##....#.##.#.##....#.###.#.#...#...###.#....#.*...#...###6
5.*.#..#.....##.......#.......@9
6.#..#..#.*.#.####...#.....#.....#.....#...#.@.##.#..#.0
0Sample
Output:108-1//用寬度優(yōu)先搜索解決此題。//每次從隊(duì)頭取一個(gè)節(jié)點(diǎn),看是否是終點(diǎn),如果不是,就將隊(duì)頭節(jié)點(diǎn)周?chē)目蛇_(dá)//的點(diǎn)都放入隊(duì)列。要記住每個(gè)點(diǎn)的上一個(gè)點(diǎn)是什么#include
<iostream>using
namespace
std;#define
SIZE
32int
M,N;char
Maze[SIZE][SIZE];int
nStartR,nStartC;int
nDestR,nDestC;int
nHead;int
nTail;struct
Position{int
r;
int
c;
int
depth;}
Queue[SIZE
*
SIZE];int
Bfs();int
main(){int
i,j,k;while(1)
{cin
>>
M
>>
N;if(
M
==
0
&&
N
==
0
)break;memset(
Maze,"#",sizeof(Maze));for(
i
=
1;i
<=
M;
i
++
)for(
j
=
1;
j
<=
N;
j
++
)
{cin
>>
Maze[i][j];if(
Maze[i][j]
==
"@"
)
{nStartR
=
i;nStartC
=
j;Maze[i][j]
=
".";}else
if(
Maze[i][j]
==
"*"
)
{nDestR
=
i;nDestC
=
j;Maze[i][j]
=
".";}}cout
<<
Bfs()
<<
endl;}}int
Bfs(
)
{nHead
=
0;nTail
=
1;Queue[nHead].r
=Queue[nHead].c
=nStartR;nStartC;Queue[nHead].depth
=
0;int
dir[][2]
=
{{0,1},{0,-1},{1,0},{-1,0}};while(
nHead
!=
nTail)
{if(
Queue[nHead].r
==
nDestR
&&
Queue[nHead].c
==
nDestC
)
{return
Queue[nHead].depth;}for(int
i
=
0;
i
<
4;
i++)
{int
nCurR
=
Queue[nHead].r
+
dir[i][0];int
nCurC
=
Queue[nHead].c
+
dir[i][1];if(Maze[nCurR][nCurC]
==
".")
{Queue[nTail].c
=
nCurC;Queue[nTail].r
=
nCurR;Queue[nTail].depth
=
Queue[nHead].depth
+1;Maze[nCurR][nCurC]
=
"#";nTail
++;}else
{if(Maze[nCurR][nCurC]
==
"*")return
Queue[nHead].depth
+
1;}}nHead
++;}return
-1;}2009年期中試題:POJ3728
Blah數(shù)集
Description:大數(shù)學(xué)家高斯小時(shí)候偶然間發(fā)現(xiàn)一種有趣的自然數(shù)集合Blah,對(duì)于以a為基的集合Ba定義如下:a是集合Ba的基,且a是Ba的第一個(gè)元素;如果x在集合Ba中,則2x+1和3x+1也都在集合Ba中;
(3)沒(méi)有其他元素在集合Ba中了。現(xiàn)在小高斯想知道如果將集合Ba中元素按照升序排列,第N個(gè)元素會(huì)是多少?
Input:輸入包括很多行,每行輸入包括兩個(gè)數(shù)字,集合的基a(1<=a<=50))以及所求元素序號(hào)n(1<=n<=1000000)Output:對(duì)于每個(gè)輸入,輸出集合Ba的第n個(gè)元素值
Sample
Input1
10028
5437Sample
Output418900585#include
<iostream>using
namespace
std;int
Stack[1000010];int
main(){int
a,n;while(
scanf("%d%d",&a,&n)
!=
EOF)
{int
p2
=
1
,p3
=
1;int
nTop
=
1;
Stack[1]
=
a;
while(1)
{if(
nTop
==
n
)
{printf("%d\n",
Stack[nTop]
);break;}if(
2
*
Stack[p2]
+
1
<
3
*
Stack[p3]+1
)
{nTop
++;Stack[nTop]
=
2
*
Stack[p2]
+
1;p2
++;}else
if(
2
*
Stack[p2]
+
1
>
3
*
Stack[p3]+1
)
{nTop
++;Stack[nTop]
=
3
*
Stack[p3]
+
1;p3
++;}else{//擴(kuò)展的結(jié)點(diǎn)相等的時(shí)候兩個(gè)指針都要向前滑動(dòng)nTop++;Stack[nTop]
=
3
*
Stack[p3]
+
1;p3
++;p2
++;}}}return
0;}POJ2804:字典詞條(一行):一個(gè)英文單詞、一個(gè)外語(yǔ)單詞100000個(gè)詞條給外語(yǔ)單詞,翻譯出英文這個(gè)題目很簡(jiǎn)單,方法較多,可以(1)排序+二分(2)hash表(3)(平衡)二叉搜索樹(shù)(4)Trie樹(shù)關(guān)鍵點(diǎn):查找的效率。以方法(1)為例:qsort→bsearch使用結(jié)構(gòu)表示詞條外語(yǔ)單詞英文單詞外文單詞作為排序的key值搜索詞條:外語(yǔ)單詞注意:qsort排序的元素類(lèi)型與bsearch查找的元素類(lèi)型要完全一致s1<=s2<=s3。證明lcp(s1,s2)>=lcp(s1,s3)。令lcp(s1,s3)=p。Lcp(s1,s2)>=p,否則lcp(s1,s2)<p,即s1(p)<s2(p)。這導(dǎo)致s3(p)=s1(p)<s2(p)即s3<s2,矛盾。POJ2797:最短前綴前綴:?jiǎn)卧~前若干個(gè)字母,不是其它單詞的前綴2~1000行可以是整個(gè)單詞這個(gè)題目關(guān)鍵點(diǎn)把有相同前綴的單詞放到一起:qsort確定它們的各自前綴,只需考慮相鄰的單詞(為什么?證明)不是前面單詞的前綴不是后面單詞的前綴按照輸入的順序輸出:qsort時(shí)間復(fù)雜度O(nlogn)兩次排序,使用結(jié)構(gòu)保存:?jiǎn)卧~本身word單詞word的前綴prefixword在輸入中的順序POJ2813:畫(huà)家問(wèn)題分析問(wèn)題特征:每一格要么畫(huà)一次,要么不畫(huà)操作順序無(wú)關(guān)性,只與在該格子上的操作次數(shù)有關(guān)猜測(cè):確定第一行的每一塊是否要畫(huà),就可以確定其他全部格子是否要畫(huà)。可能無(wú)解(無(wú)法將全部塊涂成黃色)技巧加邊框,簡(jiǎn)化計(jì)算使用位運(yùn)算,枚舉第一行的全部情況0
~
(1<<N–1)種情況第k位為1,畫(huà)第一行的第k塊移動(dòng)影響的時(shí)鐘1ABDE2
ABC3
BCEF4
ADG5
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年心理健康教育課程考試試題
- 幼兒園指南試題及答案
- 管工進(jìn)場(chǎng)考試題及答案
- 保險(xiǎn)儲(chǔ)備面試題及答案
- 書(shū)法教師試題及答案
- 電子電路設(shè)計(jì)考試題目及解析
- 網(wǎng)絡(luò)工程師綜合能力試題及答案
- 常見(jiàn)網(wǎng)絡(luò)設(shè)備的性能對(duì)比與試題及答案
- 網(wǎng)絡(luò)工程師技術(shù)難題試題及答案
- 軟件設(shè)計(jì)的重要性與考試試題及答案
- 2024年全國(guó)黃金行業(yè)職業(yè)技能競(jìng)賽(礦山救護(hù)工)理論考試題庫(kù)(含答案)
- 銑床主軸箱設(shè)計(jì)
- 刑法總論:刑事法治的中國(guó)特色智慧樹(shù)知到答案2024年湘潭大學(xué)
- 鋼琴調(diào)律服務(wù)合同
- 愛(ài)國(guó)英雄霍去病歷史人物介紹
- 冠心病合并房顫患者PCI術(shù)后抗栓治療策略
- 2024年燕舞集團(tuán)限公司公開(kāi)招聘高頻考題難、易錯(cuò)點(diǎn)模擬試題(共500題)附帶答案詳解
- 2024年中考道德與法治時(shí)事政治試題庫(kù)附答案(綜合題)
- 從自在、自覺(jué)到自為:中華民族發(fā)展的歷史邏輯
- 游戲陪玩-模板參考
- 篷布檢測(cè)報(bào)告
評(píng)論
0/150
提交評(píng)論