1. 程式人生 > >救火行動 ( save )  模擬

救火行動 ( save )  模擬

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 )  模擬