救火行動 ( save ) 模擬
阿新 • • 發佈:2017-08-25
ret string line 一點 %d space getchar() lex 第一個 【題目描述】
秋哥
喜歡唱歌。尤其是那種激情似火的歌。
“
我滴熱情,嘿,好像一把火,燃燒了整個科學館!
”
?
NeroYSQ
這不,科學館馬上就起火了。於是,我們要救火,拯救學校財產於危難之中。科學館
是一棟
N
層的建築
,起火地點位於每一層的最右邊的那件房(就是五機房所在的位置)。我
們用一個火勢值來描述一間房的火勢大小,如果一個房間的火勢值為
K
,那麽這間房就需要
至少
K
的水量才能撲滅這裏的火。
現在同學們打算用
<<
人多力量不一定大
>>
的方法來救火,方法如下:
1.
先在
每一層都部署一些人,第
i
層部署
A[i]+1
個人。
2.
將這
A[i]+1
個人順序編號為
0~A[i]
。
3.
第
0
號人(比方說
Crab
)站在每一層的廁所處,他將水從廁所的水龍頭裏引向樓
道。
4.
第
j
(
0<j<A[i]
)號人每個人手裏拿一個水桶,水桶有一個容量
B[i][j]
,他將
用自己手裏的水桶從第
j
-
1
號人那裏接水。超過他的水桶容量的水會被浪費掉。
水將以類似於接力的方式向右傳遞。第
0
號人能提供的水量可以視為無窮大。
5.
第
A[i]
號人手裏也有一個水桶,他將會把他的得到的水直接筐到著火的房間裏去,
由於這個人任務重大,他手裏的水桶是特制的,容量為
第
1~A[i
-
1]
號人手裏的水
桶的容量之和再加一。
如果這一層只有一個人,那麽這個人的水桶容量就為一。
6.
救火行動是一輪一輪進行的。在每一輪中,只有特定一層的那一組同學會工作,而
且每個人只會傳一次水,傳完了就看著別人傳,直到水被送到著火點(跟動
畫片裏
的情節挺像的!),這一輪結束。
如果這一層傳到著火點的總水量不小於這一層的火
勢值了,火將立即被撲滅。
一輪將持續固定的
一分鐘
。
7.
救火行動將從第
N
層開始,每一層的火被撲滅了下一層才會開始。
8.
由於秋哥本人就位於第五層,所以第五層的火勢特別猛烈,而且因為秋哥一直再唱
歌,所以火勢會隨著時間
不斷
增強。
秋哥有一個熱情值
P
,
每一輪結束時
,如果秋
哥所在的這一層的火還沒有被完全撲滅,這裏的火勢就會增加
P
。如果記這一輪結
束時還有
Q
層的火沒有被撲滅,這個熱情值
P
就等於
Q
。
9.
由於每次只有一層的同學處於工作狀態
,所以別的層的同學會
關註正在工作的那一
層,
每一層的火被撲滅時,所有的
同學都會因為感到非常興奮而慶祝整整一輪,在
用來慶祝的這一輪中,所有同學都不會傳水。
10.
一旦第一層的火被撲滅
或救火行動持續了
整整一天
,整個救火行動瞬間結束。
也就
是說第一層的火被撲滅時,同學們不會浪費時間來慶祝。
如果你發現了這一行字,
請不要高聲喧嘩,不要讓別人發現
求整個救火行動將持續多少輪。
【輸入數據】
第一行一個數,
N
,表示科學館有
N
層
接下來
N
行,每行若幹個數,第一個數表示
A[i]
,接下來
A[i]
-
1
個
正整
數
,第
j
個
數表示
B[i][j]
,再接下來一個
正整
數
K[i]
,表示這一層的火勢值
【輸出數據】
一個數,就是整個救火行動將持續的輪數
【輸入樣例
1
】
6
6 10 5 8 6 5 12
1 2
4 1 2 3 4
4 4 3 2 1
5 100 99 98 6 1
2 1
1
【輸出樣例
1
】
22
【輸入樣例
2
】
6
6 10 5 8 6 5 12
1 2
4 1 2 3 4
4 4 3 2 1
5 100 99
98 6 2
2 1
1
【輸出樣例
2
】
23
【輸入樣例
3
】
5
1 100
2 100 100
3 100 100 100
4 100 100 100 100
5 100 100 100 5 6
【輸出樣例
3
】
1440
【數據約定】
100%
:
5
≤
N
≤ 100
1
≤
A[i]
≤ 100
1
≤
B[i][j]
≤ 100
1
≤
K[i]
≤ 100
【友情提示】
題目描述非常長,請特別註意題目中
的
要求。
為了防止理解上的偏差,請
參考
樣例
,仔細模擬一遍樣例
。
另外還有一點,過了樣例也不一定能全對。
這題其實就是一個模擬而已,提高D1T1難度。
代碼:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define ll long long #define il inline #define db double using namespace std; il int gi() { int x=0,y=1; char ch=getchar();while(ch<‘0‘||ch> ‘9‘) { if(ch==‘-‘) y=-1; ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘) { x=x*10+ch-‘0‘; ch=getchar(); } return x*y; } il ll gl() { ll x=0,y=1; char ch=getchar(); while(ch<‘0‘||ch<‘9‘) {if(ch==‘-‘) y=-1; ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘) { x=x*10+ch-‘0‘; ch=getchar(); } return x*y; } int a[145]; int minx[145]; int b[145][145]; int k[145]; int main() { freopen("save.in","r",stdin); freopen("save.out","w",stdout); memset(minx,127/3,sizeof(minx)); int n=gi(); for(int i=1;i<=n;i++) { a[i]=gi(); for(int j=1;j<a[i];j++) { b[i][j]=gi(); minx[i]=min(minx[i],b[i][j]); } k[i]=gi(); if(a[i]==1) minx[i]=1; } int now=n,ans=0; while(now!=0) { k[now]-=minx[now]; ans++; if(k[now]<=0) { now--; ans++; k[5]+=now; } k[5]+=now; if(ans>1440 ) break; } printf("%d\n",ans-1); return 0; }
救火行動 ( save ) 模擬