申請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年3月6日 星期二

【轉載】淺談2—SAT問題

2-SAT:http://www.cppblog.com/ACflying/archive/2009/06/06/86912.html
1 2 - SAT就是2判定性問題,是一種特殊的邏輯判定問題。
2 2 - SAT問題有何特殊性?該如何求解?
3 我們從一道例題來認識2 - SAT問題,並提出對一類2 - SAT問題通用的解法。 
Poi  0106  Peaceful Commission [和平委員會]:

某國有n個黨派,每個黨派在議會中恰有2個代表。
現在要成立和平委員會 ,該會滿足:
每個黨派在和平委員會中有且只有一個代表
如果某兩個代表不和,則他們不能都屬於委員會
代表的編號從1到2n,編號為2a
- 1 、2a的代表屬於第a個黨派
輸入n(黨派數),m(不友好對數)及m對兩兩不和的代表編號
其中1≤n≤
8000 0 ≤m ≤ 20000
 

求和平委員會是否能創立。若能,求一種構成方式。
輸入:     輸出:
3   2         1       1   3         4         2   4         5               
原題可描述為:

有n個組,第i個組裡有兩個節點Ai, Ai
'  。需要從每個組中選出一個。而某些點不可以同時選出(稱之為不相容)。任務是保證選出的n個點都能兩兩相容。
(在這裡把Ai, Ai
'  的定義稍稍放寬一些,它們同時表示屬於同一個組的兩個節點。也就是說,如果我們描述Ai,那麼描述這個組的另一個節點就可以用Ai '
初步構圖
如果Ai與Aj不相容,那麼如果選擇了Ai,必須選擇Aj‘ ;同樣,如果選擇了Aj,就必須選擇Ai’ 。   Ai             Aj
' 
 Aj             Ai‘                    
這樣的兩條邊對稱


我們從一個例子來看:
假設4個組,不和的代表為:1和4,2和3,7和3,那麼構圖:
假設:首先選1 3必須選,2不可選 8必須選,
4 、7不可選  5 、6可以任選一個
矛盾的情況為:
存在Ai,使得Ai既必須被選又不可選。

得到演算法1:

枚舉每一對尚未確定的Ai, Ai‘ ,任選1個,推導出相關的組,若不矛盾,則可選擇;否則選另1個,同樣推導。若矛盾,問題必定無解。
此演算法正確性簡要說明:
由於Ai,Ai
'  都是尚未確定的,它們不與之前的組相關聯,前面的選擇不會影響Ai, Ai '  。
演算法的時間複雜度在最壞的情況下為O(nm)。
在這個演算法中,並沒有很好的利用圖中邊的對稱性
 更一般的說:
在每個一個環裡,任意一個點的選擇代表將要選擇此環裡的每一個點。不妨把環收縮成一個子節點(規定這樣的環是極大強連通子圖)。新節點的選擇表示選擇這個節點所對應的環中的每一個節點.對於原圖中的每條邊Ai
-> Aj(設Ai屬於環Si,Aj屬於環Sj)如果Si≠Sj,則在新圖中連邊:Si -> Sj

這樣構造出一個新的有向無環圖。此圖與原圖等價。
通過求強連通分量,可以把圖轉換成新的有向無環圖,在這個基礎上,介紹一個新的演算法。

新演算法中,如果存在一對Ai, Ai
' 屬於同一個環,則判無解,否則將採用拓撲排序,以自底向上的順序進行推導,一定能找到可行解。

至於這個演算法的得來及正確性,將在下一段文字中進行詳細分析。
回憶構圖的過程:
對於兩個不相容的點 Ai, Aj,構圖方式為:Ai
-> Aj ' ,Aj->Ai ' ,前面提到過,這樣的兩條邊對稱,也就是說:
如果存在Ai
-> Aj,必定存在Aj ' ->Ai '
等價於:Ai -> Ak,Ak ' ->Ai '  方便起見,之後“ -> ”代表這樣一種傳遞關係.



猜測1:圖中的環分別對稱
如果存在Ai,Aj,Ai,Aj屬於同一個環(記作Si),那麼Ai
' , Aj ' 也必定屬於一個環(記作Si ' ).
再根據前面的引理,不難推斷出每個環分別對稱。

證明方式與引理相類似
一個稍稍複雜點的結構,其中紅、藍色部分分別為兩組對稱的鏈結構
推廣2:對於任意一對Si, Si
'  ,Si的後代節點與Si '  的前代節點相互對稱。
繼而提出:
猜測2:若問題無解,則必然存在Ai, Ai
'  ,使得Ai,Ai ' 屬於同一個環。也就是,如果每一對Ai,Ai '  都不屬於同一個環,問題必定有解。下面給出簡略證明:
先提出一個跟演算法1相似的步驟:
如果選擇Si,那麼對於所有Si
-> Sj,Sj都必須被選擇。
而Si
'  必定不可選,這樣Si’的所有前代節點也必定不可選(將這一過程稱之為刪除)。
由推廣2可以得到,這樣的刪除不會導致矛盾。

假設選擇S3
'  
?選擇S3 ' 的後代節點, S1 '
?刪除S3
?刪除S3的前代節點S1
S1與S1
' 是對稱的

每次找到一個未被確定的Si,使得不存在Si
-> Si '  選擇Si及其後代節點而刪除Si’及Si‘的前代節點。一定可以構造出一組可行解。
因此猜測2成立。

另外,若每次盲目的去找一個未被確定的Si,時間複雜度相當高。
以自底向上的順序進行選擇、刪除,這樣還可以免去“選擇Si的後代節點”這一步。
用拓撲排序實現自底向上的順序。

一組可能的拓撲序列(自底向上):S1
' ,S2,S2 ' ,S3 ' ,S3,S1

演算法2的流程:
1 .構圖 2 .求圖的極大強連通子圖 3 .把每個子圖收縮成單個節點,根據原圖關係構造一個有向無環圖 4 .判斷是否有解,無解則輸出(退出) 5 .對新圖進行拓撲排序 6 .自底向上進行選擇、刪除 7 .輸出

小結:
整個演算法的時間複雜度大概是O(m),解決此問題可以說是相當有效了。
在整個演算法的構造、證明中反覆提到了一個詞:對稱。發現、利用了這個圖的特殊性質,我們才能夠很好的解決問題。
並且,由2
- SAT問題模型變換出的類似的題目都可以用上述方法解決。

全文總結:
充分挖掘圖的性質,能夠更好的解決問題。
不僅僅是對於圖論,這種思想可以在很多問題中得到很好的應用。
希望我們能掌握此種解題的思想,在熟練基礎演算法的同時深入分析、靈活運用、大膽創新,從而解決更多更新的難題。

2012年3月3日 星期六

USACO Feb12 Bronze Rope Folding 折繩子 題解


USACO 2012 February Contest, Bronze Division

Problem 1. Rope Folding




Problem 1: Rope Folding [Brian Dean, 2012] 
Farmer John has a long rope of length L (1 <= L <= 10,000) that he uses for various tasks around his farm. The rope has N knots tied into it at various distinct locations (1 <= N <= 100), including one knot at each of its two endpoints. 

FJ notices that there are certain locations at which he can fold the rope back on itself such that the knots on opposite strands all line up exactly with each-other:
  
Please help FJ count the number of folding points having this property. Folding exactly at a knot is allowed, except folding at one of the endpoints is not allowed, and extra knots on the longer side of a fold are not a problem (that is, knots only need to line up in the areas where there are two strands opposite each-other). FJ only considers making a single fold at a time; he fortunately never makes multiple folds. 

PROBLEM NAME: folding
INPUT FORMAT:
 * Line 1: Two space-separated integers, N and L.
 * Lines 2..1+N: Each line contains an integer in the range 0...L specifying the location of a single knot. Two of these lines will always be 0 and L. 

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日 星期一

OI練習題 式子 recursion

【問題描述】
動態規劃 DP 的實現形式之一是遞推,因此遞推在 oi 中十分重要。在某資訊學的分支學科中, LC 學會瞭如何求一階線性遞推數列。由於他現在正在學習主幹學科,因此希望知道求出 N 階線性遞推數列。為此,他瞭解到了以下的內容:
一個 N 階線性遞推式是這樣的式子:
也就是說,這個數列的每一項都是由他之前連續 N 項加權相加所得。其中還包括一個常數 an 。
例如,當 N=2 , a0=a1=1 , a2=0 時,這個式子就是我們熟悉的斐波那契數列。當然,作為這界條件, f0 、 f1…f n-1 都是已知的。
LC 對這如何去求這個式子一籌莫展,因此請你來幫助他。你的任務就是對於一個給定的 N 階線性遞推式,求出它的第 K 項是多少。
【輸入文件】
第一行兩個整數: N , K ,其中 N 表示這個式子是 N 階線性遞推式, K 表示你需要求得那一項。
第二行有 N+1 個整數: A0,A1,… , An ,表示這個遞推式的係數。
第三行有 N 個整數: F0 , F1 , …. , Fn-1 ,表示數列的初始值。
【輸出文件】
只有一行,其中只有一個整數,表示這個數列第 K 項的值。由於資料較大,你只需輸出結果 mod 9973 的值。

ACM/ICPC 小球鐘——時間與運動

問題描述
時間是運動的一種方式,所以常常用運動來度量時間。如圖所示的小球鍾就是一個通過不斷在軌道上移動小球來度量時間的簡單設備。
每分鐘,一個轉動臂將一個小球從小球隊列的底部擠走,將它上升到鐘的頂部並安置在一個表示分鐘, 5 分鐘和小時的軌道上。這裡可以顯示從 1:00 到 12:59 範圍內的時間,但無法表示 “a.m.” 和 “p.m.” 。若有 2 個球在分鐘軌道, 6 個球在 5 分鐘軌道及 5 個球在小時軌道上,就顯示時間 5:32 。
不幸的是,大多數市場上提供的小球鍾無法顯示日期,儘管只需要簡單地加上一些軌道就可以了。當小球通過鐘的機械裝置被移動後,它們就會改變其初始次序。仔細研究它們隨著時間的流逝發生的次序的改變,可以發現相同的次序會不斷出現。由於小球的初始次序最後遲早會被重複,所以這段時間的長短是可以被度量的,這完全取決於所提供小球的總數。
每分鐘,最近最少使用的那個小球從位於球鍾底部的小球隊列被移走,並將上升安置於顯示分鐘的軌道上,這裡可以放置 4 個小球。當第 5 個小球滾入該軌道,它們的重量使得軌道傾斜,原先在軌道上的 4 個小球按照與它們原先滾入軌道相反加入到鍾底部的小球隊列。引起傾斜的第 5 個小球滾入顯示 5 分鐘的軌道,該軌道可以放置 11 個球。當第 12 個小球滾入該軌道,它們的重量使得軌道傾斜,原先 11 個小球同樣以相反的次序加入鍾底部的小球隊列。而這第 12 個小球滾入了顯示小時的軌道。該軌道同樣可以放置 11 個球,但這裡有一個外加的固定不能被移動的小球,這樣小時的值域就變為 1 到 12 。從 5 分鐘軌道滾入的第 12 個小球將使小時軌道傾斜,這 11 個球同樣以相反的次序加入鍾底部的小球隊列,然後第 12 個小球同樣加入鍾底部的小球隊列。
輸入小球的個數,輸出該時鐘在經過多少天的運行可以回到它的初始小球序列。例如有 45 個小球的鐘經過 378 天會回到初始狀態。

圖論練習題 備用交換機 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]中的每一個頂點是否都有邊。

圖論練習題 摔跤 rassle 題解

【問題描述】
有兩種類型的職業摔跤手:一種是“好選手”,另一種是“差選手”。對於任何一對職業摔跤手來說,他們中可能有、也可能沒有比賽。假定有 n 位職業摔跤手,並且有一份清單,上面列出了 r 對參加比賽的摔跤手。寫一個程序,它能夠確定是否可能指定某些摔跤手為好選手,而將餘下的摔跤手指定為壞選手,從而使得每一場比賽都是在一個好選手與一個差選手之間進行。如果有可能做出這樣的指定,你的程序就應該將它產生出來,否則輸出無解“No”。
【輸入格式】
第1行有三個整數n,r。n是職業摔跤手的數量,r是比賽場數,它們之間用一個空格隔開。
接下來的r行,每行用兩個數V1,V2表示V1號摔跤手與V2號摔跤手比賽,選手從1開始編號。
【輸出格式】
輸出有兩行,第一行“好選手”的編號,第二行為“差選手”的編號,編號之間用一個空格隔開。
注意:為了鼓勵選手,使輸出答案唯一,請儘量多的將選手設為“好選手”,並且在可行條件下選擇編號小的選手為“好選手”。
如果無解,則輸出一行“No”。

動態規劃練習題 相似基因 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日 星期一

NOIP1995 普及組 編碼問題 code

【問題描述】
設有一個數組 A : ARRAY[0..N-1] OF INTEGER ;數組中存儲的元素為 0-N-1 之間的整數,且 A[I] ≠ A[J] ( 當 I ≠ J) 時。
例如: N=6 時,有:( 4 , 3 , 0 , 5 , 1 , 2 )
此時,數組 A 的編碼定義如下:
A[0] 的編碼為 0 :
A[I] 的編碼為:在 A[0] , A[1] ,…… A[I-1] 中比 A[I] 的值小的元素的個數( I=1 , 2 ,…… N-1 )
所以上面數組 A 的編碼為 :B=(0,0,0,3,1,2)
程序要求解決以下問題
① 給出數組 A 後,求出其編碼;
② 給出數組 A 的編碼後,求出 A 的原資料。

[動態規劃]Ural 1031 rail 火車票 解題報告

【題目描述】
現在有一條“葉卡特琳堡-斯維爾德洛夫斯克”鐵路線。它有若干個火車站。這個鐵路線可以用一條線段來表示,而火車站就是線段上的點。鐵路起始於葉卡特琳堡(Eakterinburg),終止於斯維爾德洛夫斯克(Sverlovsk),且各站從葉卡特琳堡(它的編號是1)至斯維爾德洛夫斯克(終點)編號。



兩個站之間的票價僅跟兩站間的距離有關係。票價規定如下表。

兩站間距離 - X
票價

0<X<=L1

C1

L1<X<=L2

C2

L2<X<=L3

C3

當且僅當兩站間距離不大於L3時才能購買這兩站之間的直達車票。所以有時須要購買若干張票來完成整個旅行。


例如,在上圖,整條鐵路有七個站。從第2站不能直達第6站(因為距離大於L3),但有另外幾種方法購票。其中一種是買兩張票:一張是從第2站至第3 站(票價為C2),另一張是從第3站至第6站(票價為C3),注意,雖然從第2站至第6站的距離為2×L2,但不可以買兩張價值C2的票,因為一張票只可以用一次且起點和終點必須在車站上。

你的任務時計算給出的兩站之間的最小花費。

[動態規劃]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表示某玩家上線時段
【輸出文件】
輸出最長遊戲總時間

[動態規劃]POI 1998 ple 潛水員問題 解題報告

【問題描述】
     一個潛水員在潛水時使用一種特殊的裝置:一個有兩個容器的氣筒。一個容器中裝的是氧氣,另一個容器中裝氮氣。潛水員需要攜帶的氧氣和氮氣量依賴於潛水的時間和深度。潛水員有一系列的氣筒,用來在不同的情況下攜帶。每個氣筒可以用這樣幾個量來描述:氣筒的質量,氣筒中所能容納的氧氣量,以及可以容納的氮氣量。為了能完成最近的一個任務,潛水員需要一定量的氧氣和氮氣。潛水員有一系列準備好的氣筒。他希望能攜帶總質量儘可能小的氣筒下水。現在請你幫他計算一下至少要攜帶多少質量的氣筒下水才能完成這個任務。

示例說明
潛水員有以下 5 個氣筒。每個氣筒用三個整數來描述:氣筒所能容納的氧氣的量,氮氣的量和氣筒的質量:

3 36 120
10 25 129
5 50 250
1 45 130
4 20 119
如果這次任務中潛水員需要攜帶 5 升 氧氣, 60 升 氮氣。那麼他至少要攜帶總質量為 249 的氣筒下水(樣例中的第一個和第二個氣筒或者第四個和第五個氣筒)。

2012年2月18日 星期六

[計算幾何]USACO Feb08 USACO Silver Game of Lines 連線遊戲

Title: 連線遊戲
Input: lines.in
Output: lines.out
Time Limit: 1000 ms
Memory Limit: 16 MB
Level: ★☆
Farmer John最近發明瞭一個遊戲,來考驗自命不凡的貝茜。遊戲開始的時候,FJ會給貝茜一塊畫著N (2 <= N <= 200)個不重合的點的木板,其中第i個點的橫、縱座標分別為X_i和Y_i (-1,000 <= X_i <=1,000;-1,000 <= Y_i <= 1,000)。
貝茜可以選兩個點畫一條過它們的直線,當且僅當平面上不存在與畫出直線平行的直線。遊戲結束時貝茜的得分,就是她畫出的直線的總條數。為了在遊戲中勝出,貝茜找到了你,希望你幫她計算一下最大可能得分。
程序名: lines

2012年2月16日 星期四

[多源最短路]USACO 奶牛聚會 spart

譯: zqzas
N(1 ≤ N ≤ 1000)個農場中的每個農場都有一隻奶牛去參加位於第X個農場的聚會.共有M (1 ≤ M ≤ 100,000)條單向的道路,每條道路連接一對農場.通過道路i會花費Ti (1 ≤ Ti ≤ 100)的時間.
作爲參加聚會的奶牛必須走到聚會的所在地(農場X).當聚會結束時,還要返回各自的農場.奶牛都是很懶的,她們想找出花費時間最少的路線.由於道路都是單向的,所有她們前往農場X的路線可能會不同於返程的路線.
Of all the cows, what is the longest amount of time a cow must spend walking to the party and back? 對於所有參加聚會的奶牛,找出前往聚會和返程花費總時間最多的奶牛,輸出這隻奶牛花費的總時間.

2012年2月12日 星期日

[次短路徑]HAOI2005 路由選擇問題 route 解題報告

路由選擇問題

【問題描述】

    X城有一個含有N個節點的通信網絡,在通信中,我們往往關心資訊從一個節點I傳輸到節點J的最短路徑。遺憾的是,由於種種原因,線路中總有一些節點會出故障,因此在傳輸中要避開故障節點。
任務一:在己知故障節點的情況下,求避開這些故障節點,從節點I到節點J的最短路徑S0。
任務二:在不考慮故障節點的情況下,求從節點I到節點J的最短路徑S1、第二最短路徑S2。

【輸入文件】

第1行: N I J (節點個數 起始節點 目標節點)
第2—N+1行: Sk1 Sk2…SkN (節點K到節點J的距離爲SkJ K=1,2,……,N)
最後一行: P T1 T2……Tp (故障節點的個數及編號)

【輸出文件】

S0 S1 S2 (S1<=S2 從節點I到節點J至少有兩條不同路徑)

2012年2月11日 星期六

[平衡樹]HNOI2004 寵物收養所 pet


題目描述

最近,阿Q開了一間寵物收養所。收養所提供兩種服務:收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵物,阿Q根據領養者的要求通過他自己發明的一個特殊的公式,得出該領養者希望領養的寵物的特點值a(a是一個正整數,a<2^31),而他也給每個處在收養所的寵物一個特點值。這樣他就能夠很方便的處理整個領養寵物的過程了,寵物收養所總是會有兩種情況發生:被遺棄的寵物過多或者是想要收養寵物的人太多,而寵物太少。

1.被遺棄的寵物過多時,假若到來一個領養者,這個領養者希望領養的寵物的特點值爲a,那麼它將會領養一隻目前未被領養的寵物中特點值最接近a的一隻寵物。(任何兩隻寵物的特點值都不可能是相同的,任何兩個領養者的希望領養寵物的特點值也不可能是一樣的)如果有兩隻滿足要求的寵物,即存在兩隻寵物他們的特點值分別爲a-b和a+b,那麼領養者將會領養特點值爲a-b的那隻寵物。
2.收養寵物的人過多,假若到來一只被收養的寵物,那麼哪個領養者能夠領養它呢?能夠領養它的領養者,是那個希望被領養寵物的特點值最接近該寵物特點值的領養者,如果該寵物的特點值爲a,存在兩個領養者他們希望領養寵物的特點值分別爲a-b和a+b,那麼特點值爲a-b的那個領養者將成功領養該寵物。

一個領養者領養了一個特點值爲a的寵物,而它本身希望領養的寵物的特點值爲b,那麼這個領養者的不滿意程度爲abs(a-b)。

USACO Contest Feb2012 Bronze Moo 翻譯+題解

翻譯(質量不高,將就看吧):
USACO Contest Feb2012 Bronze
Problem 3. Moo

奶牛們迷上了一個名為“Moo”的新的單詞遊戲。
在玩該遊戲時,奶牛們站成長長的一排,在隊列中的每一頭
奶牛都有責任盡可能快的大聲說出一個特定的字母。

在Moo遊戲中,這個單詞序列嚴格上說是無窮的,它是這樣開始的:
m o o m o o o m o o m o o o o m o o m o o o m o o m o o o o o

這一串最好由遞歸表示:令S(0)為三個字符的序列“moo”
那麼更長的字符串S(k)由三部分組成,第一部分是S(k-1),第二部分是"m o...o"(k+2個'o'),第三部分又是S(k-1)。例如:
S(0)="m o o"
S(1)="m o o m o o o m o o"
S(2)="m o o m o o o m o o m o o o o m o o m o o o m o o"

正如你所看到的,這個過程最終將會產生一個無窮的長字符串,並且
這個長字符串正是被玩Moo遊戲的奶牛一個一個說出。

Bessie這頭奶牛,自我感覺很聰明,他想要預測第N頭奶牛將會說出m還是o。請你幫助他!

POJ2739(Japan2005) 連續素數和 conprime 解題報告

 連續素數和   題目來源:Japan 2005 (POJ2739)


連結:http://poj.org/problem?id=2739


【問題描述】
一些正整數可以表示成一個或多個連續素數和的形式。那麼一個正整數可以表示成多少種連續素數和的形式呢?例如: 53 有 2 種連續素數和的形式分別是 5+7+11+13+17 和 53. 正整數 41 有 3 種連續素數和的形式: 2+3+5+7+11+13,11+13+17 和 41. 整數 3 只有一種連續素數和的形式就是 3 。 20 就不能表示成連續素數的和。
你的任務就是找出整數 N 能表示成的連續素數和的種數。

2012年2月10日 星期五

漢詩(かんし) 日本語對照 kanshi-nihongo

各種OI

USACO: USA Computing Olympiad 美國信息學競賽
CEOI: Central-European Olympiad in Informatics  中歐信息學競賽
SOI: Syrian Olympiad on Informatics 敘利亞信息學競賽
NOI:National Olympiad in Informatics 全國青少年信息學奧林匹克競賽
NOIP: National Olympiad in Informatics in Province 全國青少年信息學奧林匹克聯賽
BOI: Balkan Olympiad in Informatics 巴爾幹信息學競賽
BOI: Baltic Olympiad in Informatics 波羅的信息學競賽
ACM/ICPC: The ACM-ICPC International Collegiate Programming Contest 美國計算機協會世界大學生程序設計大賽
CTSE: Chinese Team Selection Contest IOI中國代表隊選拔賽暨全國信息學精英賽
IOI: International Olympiad in Informatics 國際青少年信息學奧林匹克競賽
POI: Polish Olympiad in Informatics 波蘭信息學競賽
HAOI: Henan Olympiad in Informatics NOI河南省代表隊選拔賽
GDOI: Guangdong Olympiad in Informatics NOI廣東省代表隊選拔賽
GZOI: Guangzhou Olympiad in Informatics 廣州市信息學尖子生選拔賽
BJOI: Beijing Olympiad in Informatics NOI北京市代表隊選拔賽
SDOI: Shandong Olympiad in Informatics NOI山東省代表隊選拔賽
WC: Winter Camp NOI冬令營