救火行动 ( save ) 模拟
【题目描述】
秋哥
喜欢唱歌。尤其是那种激情似火的歌。
“
我滴热情,嘿,好像一把火,燃烧了整个科学馆!
”
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难度。
这题其实就是一个模拟而已,提高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; }
PEACE