【题解】WebGoC 118866.火灾救援

题目描述

火灾啦!火灾啦!有n名受困学生,分布在各个楼层。火灾发生时,这n名同学在利用课室中的求救器发出n条求救信息。每条求救短信息中,都说明了发出求救信号的学生所在的楼层,用1-12之间的整数表示。


消防车很快就到达了学校,消防战士有两种不同的方式救出被困的同学

|------------------------------------------------|
| (1)由消防战士冒着危险上到对应楼层,每次只能救出一名同学,需花费1个单位时间 |
| (2)使用消防车的云梯,直接上升到对应楼层,一次可以救出所在楼层所有同学,需花费k个单位时间 |


特别说明:如果(1)和(2)两种方式的花费时间一样,优先使用方式(2),也就是优先使用云梯进行救援。

你的任务是帮助消防队算出每层应该使用什么方式进行救援,以及统计救出所有同学的最短时间是多少。


每个楼层用宽100、高50的、2号色的空心长方形表示,若该楼层没有被困学生则长方形内填充8号色,若该楼层使用方式(1)进行救援则长方形内填充1号色,若该楼层使用方式(2)进行救援则长方形内填充5号色。最后在教学楼底部,画一张椭圆形的救生垫,救生垫横半径为最短救援时间*5(数据保证横半径≤375)、纵半径为25、9号色,圆心与一楼长方形中心距离为50。


输入格式

第一行,2个整数n和k。(5≤n≤100,1≤k≤10)。

第二行,n个正整数,表示每个同学被困的楼层。(1≤楼层≤12)


输出格式

正确的图形。


输入/输出例子1

输入:

10 2

2 1 4 5 2 4 5 5 7 12

输出:


参考答案

cpp 复制代码
int main()
{
    int n, k;
    cin >> n >> k;
    int cnt[13];
    for(int i=0;i<n;i++)
        cnt[i]=0;
    for (int i = 0; i < n; i++)
    {
        int floor;
        cin >> floor;
        cnt[floor]++;
    }
    int Color[13];
    int totalTime = 0;
    for (int i = 1; i <= 12; i++)
    {
        int num = cnt[i];
        if (num == 0)
        {
            Color[i] = 8;
            continue;
        }
        int timeSingle = num;
        int timeLadder = k;
        int useTime;
        if (timeLadder <= timeSingle)
        {
            Color[i] = 5;
            useTime = timeLadder;
        }
        else
        {
            Color[i] = 1;
            useTime = timeSingle;
        }
        totalTime += useTime; 
    }
    p.up().moveTo(0, -300);
    for(int i = 1;i <= 12; i++) 
    {
        p.r(100, 50).rr(96, 46, Color[i]);
        p.fd(50);
    }
    p.bk(50 * 12 + 50).ee(totalTime * 5, 25, 9);
    p.hide();
    
    return 0;
}

题目链接:

https://v1.51goc.com/question/viewProgram/118866

(进去后要登录)