申請SAE

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

我的Wordpress博客的地址: http://zhuyf.tk/
顯示具有 練習題 標籤的文章。 顯示所有文章
顯示具有 練習題 標籤的文章。 顯示所有文章

2012年3月16日 星期五

Dijkstra with STL priority_queue 優先隊列

Dijkstra算法是一個經典的求單源最短路的算法,經過堆優化的Dijkstra算法有着良好的性能,雖然Heap的代碼複雜度並不算很高,但是至少也會爲程序的調試帶來一些麻煩。現在C++ STL開放了,所以可以用STL中的PQ容器(優先級隊列)來實現堆。

例題:
【題目描述】
在某個遙遠的國家裏,有n個城市。編號爲1,2,3,……,n。
這個國家的政府修建了m條雙向的公路。每條公路連接着兩個城市。沿着某條公路,開車從一個城市到另一個城市,需要花費一定的汽油。
開車每經過一個城市,都會被收取一定的費用(包括起點和終點城市)。所有的收費站都在城市中,在城市間的公路上沒有任何的收費站。
小紅現在要開車從城市u到城市v(1<=u,v<=n)。她的車最多可以裝下s升的汽油。在出發的時候,車的油箱是滿的,並且她在路上不想加油。
在路上,每經過一個城市,她要交一定的費用。如果她某次交的費用比較多,她的心情就會變得很糟。所以她想知道,在她能到達目的地的前提下,她交的費用中最多的一次最少是多少。這個問題對於她來說太難了,於是她找到了聰明的你,你能幫幫她嗎?
【輸入格式】
第一行5個正整數,n,m,u,v,s。分別表示有n個城市,m條公路,從城市u到城市v,車的油箱的容量爲s升。
接下來有n行,每行1個正整數,fi。表示經過城市i,需要交費fi元。
再接下來有m行,每行3個正整數,ai,bi,ci(1<=ai,bi<=n)。表示城市ai和城市bi之間有一條公路,如果從城市ai到城市bi,或者從城市bi到城市ai,需要用ci升汽油。
【輸出格式】
僅一個整數,表示小紅交費最多的一次的最小值。
如果她無法到達城市v,輸出-1。
【輸入樣例1】
4 4 2 3 8
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3
【輸出樣例1】
8
【輸入樣例2】
4 4 2 3 3
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3
【輸出樣例2】
-1
【數據規模】
對於60%的數據,滿足n<=200,m<=10000,s<=200
對於100%的數據,滿足n<=10000,m<=50000,s<=1000000000
對於100%的數據,滿足ci<=1000000000,fi<=1000000000,可能有兩條邊連接着相同的城市。

[分析]
這道題是道判定類題目,算法是二分答案+單源最短路。
由於數據很大,二分N+SPFA會超時1組,所以考慮Dijkstra+Heap。
[我的代碼]

C++语言: Codee#25838
001 /*
002 *Problem: NOIP模擬題 收費站
003 *Author: YeefanZhu
004 *Website: www.yeefanblog.tk
005 *GTalk: zyfworks@gmail.com
006 */
007 #include <cstdio>
008 #include <vector>
009 #include <cstdlib>
010 #include <algorithm>
011 #include <queue>
012 using namespace std;
013 const int MAXN=10001;
014 const int INF=1100000000;
015 int Cost[MAXN],BS[MAXN];
016 int N,M,S,B,E;
017 vector<int> Map[MAXN];
018 vector<int>Val[MAXN];
019
020 inline void init()
021 {
022     scanf("%d %d %d %d %d\n",&N,&M,&B,&E,&S);
023     for(int i=1;i<=N;i++)
024     {
025         scanf("%d\n",&Cost[i]);
026         BS[i]=Cost[i];
027     }
028     sort(BS+1,BS+N+1);
029     int a,b,v;
030     for(int i=1;i<=M;i++)
031     {
032         scanf("%d %d %d\n",&a,&b,&v);
033         Map[a].push_back(b);
034         Map[b].push_back(a);
035         Val[a].push_back(v);
036         Val[b].push_back(v);
037     }
038 }
039
040 priority_queue<pair<int,int> > PQ;
041 int Used[MAXN];
042 int Dist[MAXN];
043
044 inline bool SP(int x)
045
046 {
047     if(Cost[B]>x) return false;
048     for(int i=1;i<=N;i++) {Used[i]=0,Dist[i]=INF;}
049     Dist[B]=0;
050     PQ.push(make_pair(0,B));
051     int u,v,cost;
052     while(!PQ.empty())
053     {
054         u=PQ.top().second;
055         PQ.pop();
056         if(!Used[u])
057         {
058             Used[u]=1;
059             for(unsigned int i=0;i<Map[u].size();i++)
060             {
061                 v=Map[u][i];
062                 cost=Val[u][i];
063                 if(Cost[v]>x) continue;
064                 if(!Used[v]&&Dist[v]-Dist[u]>cost)
065                 {
066                     Dist[v]=Dist[u]+cost;
067                     PQ.push(make_pair(-Dist[v],v));
068                 }
069             }
070         }
071     }
072     if(Dist[E]>S) return false;
073     return true;
074 }
075
076 inline void solve()
077 {
078     int L=1,R=N;
079     int Mid;
080     if(!SP(BS[N])) {printf("-1\n");return;}
081     int Ans;
082     bool flag;
083     while(L<=R)
084     {
085         Mid=(L+R)>>1;
086         flag=SP(BS[Mid]);
087         if(flag)
088         {
089             Ans=BS[Mid];
090             R=Mid-1;
091         }
092         else L=Mid+1;
093     }
094     printf("%d\n",Ans);
095 }
096
097 int main()
098 {
099     freopen("cost.in","r",stdin);
100     freopen("cost.out","w",stdout);
101     init();
102     solve();
103     return 0;
104 }

2012年2月28日 星期二

並查集練習題 島國 jx 題解

【題目描述】
很久很久很久很久很久很久以前......
有一個島國。
這個國家的領地是一塊座標從(1,1)到(K,K)的正方形(包括領海和領陸,座標(x,y)是指(x,y)這塊土地,並非一個點)
衛星資訊會告訴你這個國家的土地情況,希望你能根據給出的資訊計算出這個國家有多少個島。
衛星給出的資訊形如x1 y1 x2 y2,表示左下角座標為x1,y1,右上角座標為x2,y2的這一個矩形區域是陸地
輸入格式:
第一行一個整數n,表示衛星會傳送給你n條資訊
下面n行每行有4個整數,x1,y1,x2,y2,含義如上
輸出格式:
第一行,一個整數Sum,表示這個國家的島的數量
注,只有一個公共點的兩塊陸地不算是一塊區域,具體如樣例

2012年2月27日 星期一

圖論練習題 備用交換機 gd 題解

問題描述
n個城市之間有通訊網絡,每個城市都有通訊交換機,直接或間接與其它城市連接。因電子設備容易損壞,需給通訊點配備備用交換機。但備用交換機數量有限,不能全部配備,只能給部分重要城市配置。於是規定:如果某個城市由於交換機損壞,不僅本城市通訊中斷,還造成其它城市通訊中斷,則配備備用交換機。請你根據城市線路情況,計算需配備備用交換機的城市個數,及需配備備用交換機城市的編號。
【輸入格式】
輸入文件有若干行
第一行,一個整數n,表示共有n個城市(2<=n<=100)
下面有若干行,每行2個數a、b,a、b是城市編號,表示a與b之間有直接通訊線路。
【輸出格式】
輸出文件有若干行
第一行,1個整數m,表示需m個備用交換機,下面有m行,每行有一個整數,表示需配備交換機的城市編號,輸出順序按編號由小到大。如果沒有城市需配備備用交換機則輸出0。

OI練習題 溶液模擬器 simulator

小 Y 太失敗了,他雖然在化學實驗課上拿來了很多溶液,但是還是沒有辦法配成想要的溶液,萬一倒錯了就沒有辦法挽回了,小 Y 遲遲不敢下手。
於是小 Y 到網上下載了一個溶液配置模擬器。溶液配置模擬器是這樣的程序:模擬器在電腦中構造一種虛擬溶液,然後你可以虛擬地向當前虛擬溶液中加入一定濃度一定質量的這種溶液,模擬器會快速地算出倒入後虛擬溶液的濃度和質量。當然,計算機最可愛的地方就是當你倒錯了可以撤銷。
模擬器的使用步驟是這樣的:
1. 為模擬器設置一個初始質量和濃度 V0 , C0% ( 0 ≤ C0≤100 )。
2. 進行一系列操作,模擬器支持兩種操作:
P(v,c) 操作:表示向當前的虛擬溶液中加入質量為 v 濃度為 c 的溶液;
Z 操作:撤銷上一步 P 操作。
但是,小 Y 不小心把模擬器弄丟了……,眼看考試迫在眉睫,小 Y 只能依靠你了。
輸入格式
第一行,兩個整數 V0 , C0 。
第二行,一個整數 n ,表示操作數( n ≤ 10000 )。
接下來 n 行,每行一條操作,格式為:
P v c 或 Z 。
之間用一個空格隔開,當只剩初始溶液的時候,再撤銷就沒有用了。
任意時刻質量不會超過 2 31 -1 。
輸出格式
n 行,每行兩個數 V i , C i , 其中 V i 為整數, C i 為實數(保留 5 位小數),之間用一個空格隔開。其中,第 i 行表示第 i 次操作以後的溶液質量和濃度。

圖論練習題 圖的平方 ljb

【問題描述】
有向圖G=(V,E)的平方是圖G^2=(V,E^2),該圖滿足下列條件:(u,w)∈E^2當且僅當對v∈V,有(u, v)∈E,且(v,w)∈E。亦即,如果圖G中頂點u和w之間存在著一條恰包含兩條邊的路徑時,則G^2必包含該邊(u,w)。
請編程序對於給定的有向圖G,查詢邊(u,w)是否存在於平方圖G^2中。
【輸入文件】
第一行有兩個整數,v(1<=v<=100000),m(1<=m<=1000),其中v表示圖G的頂點個數,(頂點按1~v編號);
接下來有m行,每行包含4個整數u1,u2,v1,v2,表示在圖G中,頂點區間[u1,u2]中的每一個頂點至頂點區間[v1,v2]中的每一個頂點都有邊相連;
接下來有一行,一個整數n(1<=n<=1000),表示查詢的個數;
接下來有n行,每一行有4個整數,x1,x2,y1,y2,表示一個詢問,即詢問在平方圖G^2中,其頂點區間[x1,x2]中的每一個頂點至頂點區間[y1,y2]中的每一個頂點是否都有邊。

動態規劃練習題 相似基因 gene 題解

問題描述
大家都知道,基因可以看作一個鹼基對序列。它包含了 4 種核苷酸,簡記作 A,C,G,T 。生物學家正致力於尋找人類基因的功能,以利用於診斷疾病和發明藥物。
在一個人類基因工作組的任務中,生物學家研究的是:兩個基因的相似程度。因為這個研究對疾病的治療有著非同尋常的作用。兩個基因的相似度的計算方法如下:
對於兩個已知基因,例如 AGTGATG 和 GTTAG ,將它們的鹼基互相對應。當然,中間可以加入一些空鹼基 - ,例如:

A G T G A T - G
- G T - - T A G

這樣 , 兩個基因之間的相似度就可以用鹼基之間相似度的總和來描述,鹼基之間的相似度如下表所示:

那麼相似度就是: (-3)+5+5+(-2)+(-3)+5+(-3)+5=9 。因為兩個基因的對應方法不唯一,例如又有:
A G T G A T G
- G T T A - G

相似度為: (-3)+5+5+(-2)+5+(-1)+5=14 。規定兩個基因的相似度為所有對應方法中,相似度最大的那個。

[搜索]ACM練習題:分球 ball 解題報告

題目來源:
1. 浙江理工大學 OnlineJudge 2584
2. 山東理工大學 OnlineJudge 1406
【問題描述】
在一個裝滿財寶的屋子裡,有2N個盒子排成一排。除了兩個相鄰的空盒外,其餘的每個盒子裡都裝有一個金球或者一個銀球,總共有N-1個金球和N-1個銀球。用圖6.3所示為一個N=5時的例子,G表示金球,S表示銀球。
G
S
S
G
G
S
G
S

任意兩個相鄰的非空的盒子裡的球可以移動到兩個相鄰的空盒中,移動不能改變這兩個球的排列順序。寫一個程序,用最少的移動次數把所有的金球都移到所有的銀球的左邊。

【拓撲排序練習題】課程安排問題 curriculum

【問題描述】
一個軟體專業的學生必須學習一系列基本課程,其中有些課程是基礎課,它獨立於其它課程,如《高等數學》、《計算引論》;而另一些課程必須在學完作為它的基礎的先修課程才能開始。如,在《程序設計基礎》和《離散數學》學完之前就不能開始學習《資料結構》。這些先決條件定義了課程之間的領先(優先)關係。請你在符合上述領先(優先)條件的前提下,給出所有課程的一個有序序列,以方便學校排課。
【輸入格式】
輸入文件有若干行
第一行,一個整數n,表示共有n(0<n<=100)門課程
第2--n+1行分別表示第1--n門課程的先修課程資訊,每行有若干個整數m,s1,s2,...,sm
m表示該門課程有m門先修課程,s1,s2,...,sm分別表示m門先修課的編號,如果該門課沒有先修課程,則m為0。
【輸出格式】
一行,n個整數,表示n門課程編號的有序序列(如果這樣的序列不存在,則輸出no;如果有多個這樣的序列,輸出字典序最小的)

【強連通分量】四面楚歌 virus 解題報告

【題目描述】
公元2008年10月31日星期五,篤志者所在的整個機房由於猖獗的病毒一片恐慌。經查證,病毒是由A1機器散播開來的。。這要追溯到29日,篤志者由於病毒被迫從A1機器撤離。
一想到病毒是從自己的機器傳開的,篤志者就心神不寧。他決定搞清楚病毒是怎麼散播開來的。事實上,機房內的機器並不是全部都能夠互相感染的。篤志者(ceeji)好不容易經過測試得到了機房中各機器間是否連通的圖表,就在他馬上就要得出結果的時候,大腦突然亂了!問題的嚴重性在於:如果他不在1s內搞清楚這個問題,機房就會整體癱瘓。現在篤志者求助於你,他需要知道病毒從未感染機房開始,最少入侵幾臺機器之後,機房就會整體感染。
【輸入格式】
文件的第一行為一個整數n,第二行至第n+1行為n*n的矩陣(若第i行第j列為1,則機器i能對機器j進行ARP攻擊(即感染機器j),若第i行第j列為0,則機器i不能感染機器j)。
文件名為“2.in”。
【輸出格式】
輸出文件只有一行,為篤志者想知道的最少感染機器數。
文件名為“2.out”。

2012年2月20日 星期一

[動態規劃]OI練習題 週年紀念聚會 aniv 解題報告

週年紀念聚會

Background
校長正在籌備學校的80週年紀念聚會。由於學校的職員有不同的職務級別,可以構成一棵以校長為根的人事關係樹。每個職員都有一個唯一的整數編號(範圍在1到N之間),並且對應一個參加聚會所獲得的歡樂度。為了使每個參加聚會者都感到歡樂,校長想設法使每個職員和他(她)的直接上司不會同時參加聚會。
Problem
你的任務是設計一份參加聚會者的名單,使總的歡樂度最高。
Input
輸入的第一行是一個整數N,1<= N <= 6000
以下的N行是對應的N個職員的歡樂度(歡樂度是一個從-128到127之間的整數)
接著是學校的人事關係樹,樹的每一行格式如下:
<L> <K>
表示第K個職員是第L個職員的直接上司。
輸入以0 0表示結束
輸出:參加聚會者獲得的最大總歡樂度

[動態規劃]OI練習題 最後的利益 9cwy 解題報告

【問題描述】
最近9C馬上就要和WY交收WOW的運營權了,9C為了最後的利益決定讓GM控制玩家上線時間。因為9C的小霸王伺服器總是容易爆滿,所以某伺服器中只剩一個玩家的位子,GM為了讓玩家在線時間總和最長。他將選擇一些上線時間不重複的玩家讓他們上線。我們假設某玩家下線以後,另一個玩家可以立即登入。但是GM又笨又懶,他希望你能幫他幫他寫一個程序來完成這個任務。
【輸入文件】
輸入文件第一行是一個正整數n,n<=10000,為玩家數量
一下n行每行含有兩個數t1、t2表示某玩家上線時段
【輸出文件】
輸出最長遊戲總時間

2012年2月9日 星期四

[數學方法]NOIP模擬題:倒水 water 解題報告

【題目描述】
一天, CC 買了 N 個容量可以認為是無限大的瓶子,開始時每個瓶子裡有 1 升水。接著 CC
發現瓶子實在太多了,於是他決定保留不超過 K 個瓶子。每次他選擇兩個當前含水量相同的瓶子,把一個瓶子的水全部倒進另一個裡,然後把空瓶丟棄。(不能丟棄有水的瓶子)
顯然在某些情況下 CC 無法達到目標,比如 N=3,K=1 。此時 CC 會重新買一些新的瓶子(新瓶子容量無限,開始時有 1 升水),以達到目標。
現在 CC 想知道,最少需要買多少新瓶子才能達到目標呢?

2012年2月6日 星期一

[數學方法]OI練習題:硬幣遊戲 coins 解題報告

 硬幣遊戲  coins.cpp/c/pas

【問題描述】
Alice 和 Bob 決定要玩一個有趣的硬幣遊戲。遊戲的一開始他們把 n (1<=n<=10^6 ) 個硬幣放成一個圓圈,如下圖所示。一次操作是指拿走一個硬幣或者拿走兩個相鄰的硬幣,而其他的硬幣留在原來的位置不動。每次操作至少要拿走一個硬幣。從 Alice 開始,遊戲雙方輪流進行操作。拿到最後一個硬幣的人獲勝。
注意:當 n>3 時,我們沿順時針方向用 C1 , C2 , ….. Cn 來表示這 n 個硬幣。如果 Alice 拿走了 C2 ,那麼 C1 和 C3 就不相鄰了!(因為它們中間有一個空位置)
假設 Alice 和 Bob 都很聰明,並且兩個人都用最好的策略來比賽。現在請你來寫一個程序判斷誰將會贏得這個比賽?

2012年1月31日 星期二

[歐拉路]NOIP模擬題:傳送機 sent 解題報告

  【題目描述】
  刷完牙洗完臉,黃黃同學就要上課去了。可是黃黃同學每次去上課時總喜歡把校園裡面的每條路都走一遍,當然,黃黃同學想每條路也只走一遍。我們一般人很可能對一些地圖是辦不到每條路走一遍且僅走一遍的,但是黃黃同學有個傳送機,他可以任意地將一個人從一個路口傳送到任意一個路口。
可是,每傳送一次是需要耗費巨大的內力的,黃黃同學希望可以用最少的傳送次數完成遊遍校園,你能幫助他嗎 ?
因為黃黃同學只是遊歷校園,於是我們可以認為黃黃同學可以從任意點開始,到任意點結束。


2012年1月29日 星期日

[動態規劃]OI練習題:取數字遊戲 number

Title: 取數字遊戲【試題連結
Input: number.in
Output: number.out
Time Limit: 1000 ms
Memory Limit: 128 MB
Level: ★☆
【問題描述】
給定 M*N 的矩陣,其中的每個元素都是 -10 到 10 之間的整數。你的任務是從左上角( 1 , 1 )走到右下角( M , N ),每一步只能向右或向下,並且不能走出矩陣的範圍。你所經過的方格裏面的數字都必須被選取,請找出一條最合適的道路,使得在路上被選取的數字之和是儘可能小的正整數。

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個登山隊計劃在這座山的不同區段登山,當他們攀到各自區段的最高峯時,就會插上隊旗。請你寫一個程序找出他們插旗的高度。

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

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

2012年1月20日 星期五

[搜索]OI練習題:求圖形面積 area

題一 求圖形面積
【問題描述】
具有不同顏色的 N 個小的矩形的紙被疊放在一張白紙上, 紙的尺寸是寬(左右)為A, 長(上下)為B,擺放矩形時使矩形的邊與紙的邊平行,並且每個矩形必須整個放在紙的邊界之內。因此,不同顏色的各種不同圖形可在紙上出現,同一顏色的兩個區域中如果至少有一個公共點,則認為它們是同一圖形的一部分,否則認為是不同的圖形。
題目要求計算每一圖形的面積。 A , B 是正的偶數,且均不大於30 。座標系統的定義為:座標原點在紙的中心,兩個軸分別平行於紙的兩邊。

2012年1月18日 星期三

[動態規劃]OI練習題:打鼴鼠 mouse 解題報告


【問題背景】
鼴鼠是一種很喜歡挖洞的動物,但每過一定的時間,它還是喜歡把頭探出到地面上來透透氣的。
根據這個特點阿Q編寫了一個打鼴鼠的遊戲:在一個n*n的網格中,在某些時刻鼴鼠會在某一個網格探出頭來透透氣。你可以控制一個機器人來打鼴鼠,如果i時刻鼴鼠在某個網格中出現,而機器人也處於同一網格的話,那麼這個鼴鼠就會被機器人打死。而機器人每一時刻只能夠移動一格或停留在原地不動。機器人的移動是指從當前所處的網格移向相鄰的網格,即從座標為(i,j)的網格移向(i-1, j),(i+1, j),(i,j-1),(i,j+1)四個網格,機器人不能走出整個n*n的網格。遊戲開始時,你可以自由選定機器人的初始位置。
【任務描述】
現在你知道在一段時間內,鼴鼠出現的時間和地點,希望你編寫一個程序使機器人在這一段時間內打死儘可能多的鼴鼠。

2012年1月17日 星期二

[數論]OI練習題:最優分解方案 best 解題報告

[問題描述]
經過第一輪的遊戲,不少同學將會獲得聖誕特別禮物,但這時細心的數學課代表發現了一個問題:留下來的人太多而使禮物數量可能不夠,為此,加試了一道數學題:將一個正整數 n 分解成若干個互不相等的正整數的和,使得這些數的乘積最大,當主持人報出一個 n 後,請你立即將這個最大值報出來,現請你幫你的好友編一個程序來解決這個問題。