申請SAE

如果您發現本博客的外觀很難看,那是因為部分外觀文件被中國.國家.防火.牆屏.蔽所致!
請翻~牆!

我的Wordpress博客的地址: http://zhuyf.tk/

2012年1月28日 星期六

[RMQ問題]OI練習題:綿延的山峰 climb 解題報告

Title: 延綿的山峰 傳送門
Input: climb.in
Output: climb.out
Time Limit: 1000 ms
Memory Limit: 128 MB
Level: ★★

問題描述
 
有一座延綿不斷、跌宕起伏的山,最低處海拔為0,最高處海拔不超過8848米,從這座山的一端走到另一端的過程中,每走1米海拔就升高或降低1米。有Q個登山隊計劃在這座山的不同區段登山,當他們攀到各自區段的最高峯時,就會插上隊旗。請你寫一個程序找出他們插旗的高度。

[最短路徑][二分答案]USACO Jan08 Silver 架設電話線 phoneline 解題報告

Title: 架設電話線【試題傳送門
Input: phoneline.in
Output: phoneline.out
Time Limit: 1000 ms
Memory Limit: 16 MB
Level: ★★☆
Farmer John打算將電話線引到自己的農場,但電信公司並不打算為他提供免費服務。於是,FJ必須為此向電信公司支付一定的費用。
FJ的農場周圍分佈著N(1 <= N <= 1,000)根按1..N順次編號的廢棄的電話線杆,任意兩根電話線杆間都沒有電話線相連。一共P(1 <= P <= 10,000)對電話線杆間可以拉電話線,其餘的那些由於隔得太遠而無法被連接。
第i對電話線杆的兩個端點分別為A_i、B_i,它們間的距離為L_i (1 <= L_i <= 1,000,000)。資料中保證每對{A_i,B_i}最多隻出現1次。編號為1的電話線杆已經接入了全國的電話網絡,整個農場的電話線全都連到了編號 為N的電話線杆上。也就是說,FJ的任務僅僅是找一條將1號和N號電話線杆連起來的路徑,其餘的電話線杆並不一定要連入電話網絡。
經過談判,電信公司最終同意免費為FJ連結K(0 <= K < N)對由FJ指定的電話線杆。對於此外的那些電話線,FJ需要為它們付的費用,等於其中最長的電話線的長度(每根電話線僅連結一對電話線杆)。如果需要連 結的電話線杆不超過K對,那麼FJ的總支出為0。
請你計算一下,FJ最少需要在電話線上花多少錢。
程序名: phoneline

[字典樹]OI練習題:詞鏈 link 解題報告

Title: 詞鏈【傳送門
Input: link.in
Output: link.out
Time Limit: 1000 ms
Memory Limit: 128 MB
Level: ★☆
【問題描述】
給定一個僅包含小寫字母的英文單詞表,其中每個單詞最多包含 50 個字母。
如果一張由一個詞或多個片語成的表中,每個單詞(除了最後一個)都是排在它後面的單詞的前綴,則稱此表為一個詞鏈。例如下面的單片語成了一個詞鏈:
i
int
integer
而下面的單詞不組成詞鏈:
integer
intern
請在給定的單詞表中取出一些詞,組成最長的詞鏈。最長的詞鏈就是包含單詞數最多的詞鏈。
資料保證給定的單詞表中,單詞互不相同,並且單詞按字典順序排列。

USACO Jan08 Bronze 化裝晚會 costume 解題報告

Title: 化装晚会【題目連結
Input: costume.in
Output: costume.out
Time Limit: 1000 ms
Memory Limit: 16 MB
Level: ★☆
萬聖節又到了!Farmer John打算帶他的奶牛去參加一個化裝晚會,但是,FJ只做了一套能容 下兩頭總長不超過S(1 <= S <= 1,000,000)的牛的恐怖服裝。FJ養了N(2 <= N <= 20,000)頭按1..N順序編號的奶牛,編號為i的奶牛的長度為L_i(1 <= L_i <= 1,000,000)。如果兩頭奶牛的總長度不超過S,那麼她們就能穿下這套服裝。
FJ想知道,如果他想選擇兩頭不同的奶牛來穿這套衣服,一共有多少種滿足條件的方案。
程序名: costume

2012年1月25日 星期三

[搜索]USACO Feb08 Silver 流星雨 meteor 解題報告

題目連結:http://cogs.yeefanblog.tk/t/138
Title: 流星雨
Input: meteor.in
Output: meteor.out
Time Limit: 1000 ms
Memory Limit: 128 MB
Level: ★☆
貝茜聽說了一個駭人聽聞的消息:一場流星雨即將襲擊整個農場,由於流星體積過大它們無法在撞擊到地面前燃燒殆盡,屆時將會對它撞到的一切東西造成毀 滅性的打擊。很自然地,貝茜開始擔心自己的安全問題。以FJ牧場中最聰明的奶牛的名譽起誓,她一定要在被流星砸到前,到達一個安全的地方(也就是說,一塊 不會被任何流星砸到的土地)。如果將牧場放入一個直角座標系中,貝茜現在的位置是原點,並且,貝茜不能踏上一塊被流星砸過的土地。
根據預報,一共有M顆流星(1 <= M <= 50,000)會墜落在農場上,其中第i顆流星會在時刻T_i (0 <= T_i <= 1,000)砸在座標為(X_i, Y_i) (0 <= X_i <= 300;0 <= Y_i <= 300)的格子裡。流星的力量會將它所在的格子,以及周圍4個相鄰的格子都化為焦土,當然貝茜也無法再在這些格子上行走。
貝茜在時刻0開始行動,它只能在第一象限中,平行於座標軸行動,每1個時刻中,她能移動到相鄰的(一般是4個)格子中的任意一個,當然目標格子要沒有被燒焦才行。如果一個格子在時刻t被流星撞擊或燒焦,那麼貝茜只能在t之前的時刻在這個格子裡出現。
請你計算一下,貝茜最少需要多少時間才能到達一個安全的格子。
程序名: meteor

POI1997 階梯教室設備利用 rez 解題報告

階梯教室設備利用
【問題描述】
我們現有許多演講要在階梯教室中舉行。每一個演講都可以用唯一的起始和終止時間來確定,如果兩個演講時間有部分或全部重複,那麼它們是無法同時在階級教室中舉行的。現在我們想要盡最大可能的利用這個教室,也就是說,我們需要在這些演講中選擇一些不重複的演講來舉行使得他們用的總時間儘可能的長。我們假設在某一演講結束的瞬間我們就可以立即開始另一個演講。
任務:
請寫一個程序:
• 在輸入文件中讀入所有演講的起始和終止時間;
• 計算最大的可能演講總時間;
• 把結果寫到輸出文件中。
【輸入文件】
在輸入文件的第一行包括一個正整數 n , n <= 10000 ,為所有的演講的數目。
以下的 n 行每行含有兩個由空格隔開整數 p 和 k , 0 <= p < k <= 30000 。這樣的一對整數表示一個演講由時間 p 開始到時間 k 結束。
【輸出文件】
輸出文件只有唯一的一個整數,為最長的演講總時間。

GZOI2011 Rail 解題報告

第四題(40分)
提交文件:Rail.exe
輸入文件:Rail.in
輸出文件:Rail.out
題目描述:
你所在的省剛獲得國家撥款興建高鐵,高鐵的起止城市是國家選定的,中途可能經過若干城市。根據國家撥款的政策,國家將負擔費用最大的兩個區間,其餘的必須由省負擔。假如高鐵線路中途只經過一個城市,國家只負擔費用較大的區間。假如是直達的,國家將不負擔任何費用。
你被省裡選定作為這個項目的總工程師,你必須規劃出一條高鐵線路,使得省負擔的費用最少。當然,路線上每個城市最多只經過一次。

GZOI2011 Pack 解題報告


第一題(20分)
提交文件:Pack.exe
輸入文件:Pack.in
輸出文件:Pack.out
 
題目描述:
你在一個組合式傢俱廠工作,這種組合式傢俱由各種形狀不同的組件組成,例如:

1 三种不同形状的组件
這些組件生產出來後將被自動裝箱,組件按生產的次序落下,第一個組件落在箱子底部,其後的組件依次落下,直至組件接觸到之前裝入的組件或箱子底部。例如,假設組件按圖1從左至右的次序生產出來,裝箱結果將如圖2左所示。假如按圖1從右至左的次序生產出來,裝箱結果將如圖2右所示。
                 圖2 不同的生產次序導致兩種不同的裝箱結果
由於箱子高度有限,如圖2左,三個組件已經超過了箱子的高度,這種情況第三個組件及之後的組件需要用新的箱子來裝。
你的工作是為自動裝箱系統編寫程序,根據組件生產的次序,輸出裝完這些組件後,每個箱子的組件堆疊的高度。

GDOI2011 樂譜變調 music 解題報告

五、樂譜變調(30分 1-4資料5分,最後一個資料10分)
輸入文件:music.in
輸出文件:music.out
【問題描述】
大家應該聽過很多美妙動聽的歌曲,也曾經在卡拉OK中唱過不少歌曲。其實,很多歌曲的調子都經過了變調,因為很多歌曲原來的調子一般都偏高,需要把調適當降低,才適合一般人歌唱。現在請你編程解決這個變調的問題,把一個曲譜從原來的調子基礎上,升高或降低若干個調,變成一個新的曲譜。
【音階】
相信大家都見過電子琴,也聽過電子琴,琴中的每個白色鍵,代表的是簡譜中的1,2,3,4,5,6,7的音階,用字母代表即為 C,D,E,F,G,A,B,見下圖:
此外,上面的黑鍵表示半音,按照上圖,從左邊到右邊的5個黑鍵代表的半音為:#C,#D,#F,#G,#A
由最左邊的音階C數起到第七個音階B,中間的黑鍵和鍵,均處於一個基準八度區域,在B右邊的琴鍵,比原來的音階高一個八度區域,稱為高八度區域; C音階左邊的琴鍵(圖片沒有顯示),比原來的音階低一個八度區域,稱為低八度區域。
【樂譜】
一個歌曲的樂譜,包括音階、節奏、小節線、休止符等元素,這裡為了簡單表示,只保留音階這一元素,節奏、小節線、休止符不在此題目中展現。
樂譜中的每個音階,可以用C,D,E,F,G,A,B,#C,#D,#F,#G,#A 表示。
在樂譜中會牽涉到八度區域的遷移問題,我們使用 “>”、“<” 來變化當前的八度區域。其中“>”表示提高當前八度區域(例如從低八度區域=>基準八度區域),“<”表示降低當前八度區域(例如高八度區域=>基準八度區域)。樂譜一開始的時候,當前八度區域為基準八度區域。
【樂譜變調】
對一個樂譜,提高或者降低N個半音的操作,成為樂譜變調。
首先,對於一個八度區域中,以下音階均相隔一個半音。
C,#C,D,#D,E,F,#F,G,#G,A,#A,B
然後,B音階比高它一個八度區域的C音階,相隔一個半音
變調就是一個簡單的升降音階的操作,只要數著半音階個數修改音階即可。例如,C音階提高6個半音,數過去就是#F,B音階提高4個音階,則為下一個八度區域的 #D 音階,同理,#F降6個半音階(升-6個半音)則為C。
【輸入格式】
輸入第一行字元串,包含上面的各個音階,以及>/<符號,表示一個樂譜,樂譜字元串長度<=200,沒有空格和其他字元串。
輸入第二行為整數N (-16<=N<=16) ,表示升多少個半音
【輸出格式】
輸出為一行字元串,代表樂譜。
【輸入樣例】
CDEFGAB>C
2
【輸出樣例】
DE#FGAB>#CD

【分析】
看著題目挺花哨,其實很簡單,就是一個模擬,只要讀請題目一般都能滿分。

【我的代碼】

C++语言: Codee#25363
001 /*
002 *Problem: GDOI2011 Music
003 *Author: Yee-fan Zhu
004 *Email: zyfworks@gmail.com
005 */
006 #include <cstdlib>
007 #include <iostream>
008 #include <cstdio>
009 #include <cstring>
010 using namespace std;
011 int N;
012
013 int num[300];
014 int M=0;
015
016 int Hash(char a,char b)
017 {
018     if(a=='C' && b=='0') return 1;
019     if(a=='#' && b=='C') return 2;
020     if(a=='D' && b=='0') return 3;
021     if(a=='#' && b=='D') return 4;
022     if(a=='E' && b=='0') return 5;
023     if(a=='F' && b=='0') return 6;
024     if(a=='#' && b=='F') return 7;
025     if(a=='G' && b=='0') return 8;
026     if(a=='#' && b=='G') return 9;
027     if(a=='A' && b=='0') return 10;
028     if(a=='#' && b=='A') return 11;
029     if(a=='B' && b=='0') return 12;
030     return 0;
031 }
032
033 void print(int a)
034 {
035     if(a==1) printf("C");
036     if(a==2) printf("#C");
037     if(a==3) printf("D");
038     if(a==4) printf("#D");
039     if(a==5) printf("E");
040     if(a==6) printf("F");
041     if(a==7) printf("#F");
042     if(a==8) printf("G");
043     if(a==9) printf("#G");
044     if(a==10) printf("A");
045     if(a==11) printf("#A");
046     if(a==0) printf("B");
047 }
048
049 void init()
050 {   
051     char str[300];
052     scanf("%s\n%d\n",&str,&N);
053     int len=strlen(str);
054     int top=0;
055     int now=2;
056     while(top<len)
057     {
058         char c=str[top];
059         if(c=='#')
060         {
061             int res=(now-1)*12+Hash(c,str[top+1]);
062             num[++M]=res;
063             top+=2;
064             continue;
065         }
066         if(c=='>')
067         {
068             now++;
069             top++;
070             continue;
071         }
072         if(c=='<')
073         {
074             now--;
075             top++;
076             continue;
077         }
078        
079         int res=(now-1)*12+Hash(c,'0');
080         num[++M]=res;
081         top++;
082         continue;
083     }
084 }
085
086 void work()
087 {
088     for (int i=1;i<=M;i++)
089         num[i]+=N;
090     int now=2;
091     int up=25;
092     int down=12;
093     for(int i=1;i<=M;i++)
094     {
095         int tmp=num[i];
096         if(tmp<=down)
097         {
098             now--;
099             down-=12;
100             up-=12;
101             printf("<");
102             print(tmp%12);
103             continue;
104         }
105         if(tmp>=up)
106         {
107             now++;
108             down+=12;
109             up+=12;
110             printf(">");
111             print(tmp%12);
112             continue;
113         }
114         print(tmp%12);
115     }
116 }
117
118 int main()
119 {
120     freopen("music.in","r",stdin);
121     freopen("music.out","w",stdout);
122     init();
123     work();
124     return 0;
125 }