救火行动 ( 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难度。
代码:
#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;
}

 

posted @ 2017-08-25 21:49  GSHDYJZ  阅读(313)  评论(0编辑  收藏  举报