解题者黄锦辉Word文档下载推荐.docx
- 文档编号:22872725
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:19
- 大小:22.46KB
解题者黄锦辉Word文档下载推荐.docx
《解题者黄锦辉Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《解题者黄锦辉Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
設計一個有關航空飛行的程式,在一次飛行旅程中,至少有一個以上的小行程(leg),舉例來說,有一段旅程是從台北到紐約.途中可能先飛到東京,再轉至夏威夷,其次到洛杉磯,最後才抵達紐約,此段飛行共有四個小行程,即(台北,東京),(東京,夏威夷),(夏威夷,洛杉磯),(洛杉磯,紐約).程式要計算出每段小行程中,飛機的飛行高度,使整個旅程飛機的耗油量為最少.
假設飛機以固定每小時400knots的飛行速度(airspeed)行進,而最有效的飛行高度為30,000feet,此高度飛行的耗油量為每小時2000加侖,若不在30,000feet的高度飛行,每差1000feet,每小時耗油量加10加侖,飛機每爬升1000feet要消耗50加侖的油,下降則不消耗油.飛機起飛和降落都在0feet的高度,且飛機爬升或降落都不花費時間.若遇到順風,飛機的速度(airspeed)會增加,若遇到逆風,則飛行速度會減少,舉例來說,如果飛行速度為400knots,風速為–35knots,則飛行速度變為350knots.
原則上,飛機都以1000feet倍數的高度飛行,且介於20,000feet~40,000feet之間.
假設有一旅程有兩段小行程(leg),每段小行程有三組資料,分別為行程長度,20,000feet高度的風速,40,000feet高度的風速.20,000feet~40,000feet之間的風速採線性插值(linearinterpolation)的方式,資料表示如下:
2---------------->
表示有兩段小行程
1500–5050
100000
解答為第一段飛行高度為35,000feet,第二段飛行高度為30,000feet,總共耗油量為13985加侖.
SampleInputOutputfortheSampleInput
2(表示有兩個旅程要計算)Flight1:
353013985
2Flight2:
20304023983
1500–5050
100000
3
1000500
2000020
1800–50100
因需計算飛機在每段小行程之間轉換時爬升或下降而耗費的油量,所以小行程(leg)之間不獨立,須利用dynamicProgramming的方法.
無
ProblemC:
LeadorGold
黃嘉茂
1998年8月25日
點石成金,設有A、B、C三種元素,今有數種由A、B、C組成之混合物,若將這些混合物一某比例合成時,此合成物為黃金。
現有混合物三種,比例為1:
2:
3、3:
7:
1、2:
1:
2,現在想做出3:
4:
5比例的合成物。
當八份的1:
3、一份的3:
1、五份的2:
2合成時,恰組成3:
5的合成物,此為其解。
做一矩陣,第一行為1X+3Y+2Z=3,X、Y、Z為合成時三種混合物的比例。
Ex:
1323
2714
3125
如X、Y、Z有正解,這題即為有解。
1323
第一行乘2減去第二行乘3減去第三行
->
01-3-2
0-8-4-4
第二行乘8加上第三行
00-28-10
檢查第三行是否前三項的正負都和第四項相反,如果是,此題無解,再檢查上一行,如果都有解,此題有解。
上次討論出判斷是否有正解的方法,應推廣到每一行都需做此判斷。
無
★★☆☆☆
ProblemD:
PageSelectionbyKeywordMatching
史忠榮
1998年8月28日
由關鍵字(Keyword),找出『最接近』的5頁Pages。
每頁Page最多有8個關鍵字。
『最接近』定義如下:
假設Page1:
A B C
Page2:
C D
Page3:
C
A,B,C,D為關鍵字。
查詢(Query)條件為C A,設一數N(本題為8)。
則:
Page1的關聯度為(8*6)+(7*8)=104;
Page2為(8*8)= 64;
Page3為(8*8)=64。
所以Output為:
P1P2P3。
參照『題意』。
無特殊解法,對每一個Query,各別求出每頁Page的關聯度。
無。
/*
Sampleinput:
PSmalltalkprogrammingcomputers
Pcomputersprogramming
PcomputersSmalltalk
PFORTRANprogramming
PCOBOLprogramming
Pprogramming
QSmalltalk
Qprogramming
Qcomputers
QSmalltalkcomputers
QSmalltalkprogramming
QcookingFrench
E
Sampleoutput:
QueryPages
Q1P1P3
Q2P6P1P2P4P5
Q3P2P3P1
Q4P3P1P2
Q5P1P3P6P2P4
Q6
*/
#include<
stdio.h>
stdlib.h>
string.h>
#defineN8
charpage[25][8][21];
//每頁Page的Keywords
intlen[25],pagen;
//每頁Page的Keyword數;
全部頁數
intcompare(constvoid*,constvoid*);
//記錄關聯度
structrec
{
intindex,value;
};
voidmain()
FILE*in;
charstr[300],*ptr;
//讀入Page的Keyword
in=fopen("
page.in"
"
r"
);
for(pagen=0;
;
)
{
fgets(str,300,in);
ptr=strtok(str,"
\n\t\r"
if(strcmp(ptr,"
E"
)==0)
break;
Q"
continue;
for(len[pagen]=0;
len[pagen]++)
ptr=strtok(NULL,"
if(ptr==NULL)
strcpy(page[pagen][len[pagen]],ptr);
}
pagen++;
fclose(in);
//讀入Query的Keyword
printf("
QueryPages"
for(intq=1;
charquery[8][30];
intqlen;
fgets(str,300,in);
P"
for(qlen=0;
qlen++)
strcpy(query[qlen],ptr);
recvalue[25];
for(inti=0;
i<
25;
i++)
value[i].value=0;
value[i].index=i+1;
//計算關聯度
for(i=0;
=pagen;
for(intj=0;
j<
=len[j];
j++)
for(intk=0;
k<
qlen;
k++)
if(strcmp(query[k],page[i][j])==0)
value[i].value+=(N-j)*(N-k);
qsort((void*)value,25,sizeof(rec),compare);
\nQ%d"
q);
5;
if(value[i].value!
=0)
P%d"
value[i].index);
q++;
}
intcompare(constvoid*a,constvoid*b)
rec*x=(rec*)a,*y=(rec*)b;
if(x->
value<
y->
value)
return1;
//假如關聯度一樣,Page頁碼由小到大
value==y->
index>
index)
else
return-1;
★★★★★
題組:
ACMProgrammingContestWorldFinals,1998
題號:
ProblemE:
PetriNetSimulation
解題者:
張震達
解題日期:
1998年7月29日
題意:
一個Petrinet是用來解釋concurrentactivity,每個Petrinet的成員有Places,tokens,transitions,和路徑(連通places到transitions與連通transitions
到places),而每個place可有零個或多個tokens。
本題則是用來模擬Petrinet之運作情形。
題意範例:
如上圖,P1(place)有一個token,而P2則無任何token,此時,T1(transition)
的狀態為enabled而T2的狀態為disabled(因為T1之輸入P1有一token,而
T2之輸入P2則無)。
又當一transition為enabled,則它就可以fire(將input
place的tokensremoved,而在outputplace則加入tokens)。
所以,在上圖,T1enabled且fire後,一個token由P1removed,而在P2
則加入一個token。
此時,我們可知T1就變成disable,而T2則變為enabled,
所以,若T2此時fire,一個token由P2removed,而在P1處則加入一個token
。
回復到一開始時的情況,因此很明顯地,這個Pertinet會一直重複在這個
cycle的動作。
解法:
以下為解法步驟:
(1)若輸入的places個數為n,則宣告一個可放n個整數的陣列,用來表示
各個place所擁有的token之個數。
(2)若輸入的transitions的個數為m,則宣告一個可放m個字元的陣列,用
來表示transitions的狀態(T表enabled,F表disabled)。
(3)再宣告一個mxn的二維陣列(或動態陣列),用來表示每transition的輸
入與輸出的places。
(負的代表輸入的place,正的則代表輸出的place)
(4)利用題意所給的各個place的輸入輸出的token數與路徑數(幾個輸入和
幾個輸出),來初始化transitions之陣列之值。
(5)依題意給之fire數,去做模擬Petrinet的動作。
(利用forloop或others
方法)
解法範例:
input:
3(place數)
300(各個place的token數)
3(transition數)
-12(T1的inputplace與outputplace)
-2-23(T2的inputplace與outputplace)
-31(T3的inputplace與outputplace)
100(fire數)
上面的輸入如下圖:
則依上解法之步驟,所得到結果為
deadafter9transitions
Placeswithtokens:
2
(1)(表P2有一token)
討論:
因為題意並沒有說明清楚,若有數個transitions可以同時enabled且要
fire時,彼此fire的優先順序,故若是模擬後的結果為dead沒問題;
但若是
結果為live則可能會有數種不同的tokens分佈於各個place的情況。
程式:
無
題組:
ACMProgrammingContestWorldFinals,1998
題號:
ProblemF
解題者:
李怡謀
解題日期:
1998年8月5日
題意:
解出平面上兩多邊形交集部份(凹凸多邊形皆可),每一多邊形以一頂點序列表示,方向為順時針.解出交集部份後亦以同樣方式表示結果.由於凹多邊形是被允許的,所以解可能有多個多邊形.
解法:
把交點視為一頂點,所以多邊形邊將增加,爾後判斷邊是否在另一多邊形中,若是的話,由邊的另一端點找鄰邊,再作判斷,直到所有的邊都找到後,再從中找共用的頂點就可以決定解了
解法範例:
討論:
程式:
ProblemG:
SpatialStructures
等級:
電腦繪圖,影像處理與GIS(geographicinformationsystems)所有資料結
構的使用被稱為一quadtree.Quadtree有效地表示regional或blockdata同時
對於影像的union和intersection的運算提供了有效率的演算法。
本題則是
用來了解影像表示的兩種方法(矩陣與一系列之有序數字)之間的轉換。
如上左圖的影像,其被表示一陣列如上面中間之圖。
因為陣列中的值
有0有1,所以將其切成四個子block,然後在各別看每個子block其內的值,
若只有0或只有1,則就不需再切割,否則就在將子block切分成更小的四
個block,因此就會得到上右圖。
然後依著NW
(1),NE
(2),SW(3),SE(4)順序,依序將每個block給予號,
就有上右圖中的號碼值。
而依照上右圖就可建構一quadtree了。
root表示
pixels的entirearray。
每個非leaf的node有4個children相對於4個子block
(依照上面NW,NE,SW,SE的順序)。
而leafnode則表示block有相同的顏色
且不會再被切割。
因此,就可以得到下面這樣的quadtreetree:
然後,一個tree就可以被表示成一序列的數字,表示blocknodes的root-to-
leafpath。
例如:
編號4有pathNE,SW所以是32(base5)或17(base10)
;
編號15有pathNE,SW,NW所以是134(base5)或44(base10)。
故最後就
可以把這個影像表示成下列有序數字(base10):
9141722234463698894113
若輸入的影像資料為一陣列,則依下步驟去解:
(1)check此陣列中的每一個值_與其他值是否相等,若任一有一值不相等,
則將此陣列分成4個相同大小的陣列。
否則將此陣列給予一個編號。
(2)將這4個陣列依照上左,上右,下左,下右順序重複步驟
(1),
(2)直到每一
陣列(block)內的值都相同為止。
(3)依照編好號碼順序,給予建構一tree。
(4)travel由tree的root到每一個leafnode即可得到一序列的數字(base5)
(由左到右4各branch編號為1,2,3,4即為NW,NE,SW,SE)同時將其
轉為base為10的數字。
(5)再sort這些數字即可得到表示此影像的數字資料(base10)。
_
而若輸入影像資料為一序列的數字,則利用上步驟相反順序即可得到影像
的陣列表示方法。
(base5base10)
★★★★☆
ProblemH:
TowersofPowers
給予一組數字n和b,以數字b為底數將n”完全”展開(completebase-bexpansionofn).就是將所有的指數都要以b為底數繼續展開,到無法展開為止,且係數(coefficient)與底數(base)之間要用”*”號分隔,係數(coefficient)為0不列出,以1取代b0,以b2取代1*b2,以b取代b1.每個數字(如2,3,…)或符號(如+,*)皆佔用一行(onecolumn).每一列(row)最多印出80行(column).
若n=16647,b=2,則”完全”展開的式子如下:
2+122+1
2+2+222
16647=2+2+2+1
SampleInput
200003
166472
100012
850262443
00------------>
表示資料輸入完畢
OutputfortheSampleInput
20000incompletebase3:
2
33+232
20000=3+3+2*3+2*3+2
16647incompletebase2:
16647=2+2+2+1
1000incompletebase12:
1000=6*12+11*12+4
85026244incompletebase3:
222222
3+2*3+13+2*33+3+23+3+13+23+1
85026244=3+2*3+2*3+2*3+2*3+2*3
32*3+12*3+13
+2*3+2*3+3+2*3+1
史上最快最全的网络文档批量下载、上传、处理,尽在:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 解题 者黄锦辉