• 2018美团CodeM编程大赛初赛B轮 A题开关灯




    题目描述

    美团的办公室一共有n层,每层有m个会议室,可以看成是一个n*m的网格图。工程师们每天的工作需要协作的地方很多,经常要到会议室开会解决各种问题。公司是提倡勤俭节约的,因此每次会议室只在使用时才开灯。
    当一个工程师进入会议室时,假设没有其他人,他会把灯打开。
    当一个工程师离开会议室时,假设没有其他人,他会把灯关掉。
    现在给出一系列工程师进出会议室的记录,请问在此过程中,最多有多少会议室的灯是亮着的?请输出亮灯数最多时,每个会议室的明暗状态。

    输入描述:

    第一行三个整数n,m,k,分别表示总行数、总列数、工程师的进出记录数。
    接下来k行,每行三个整数和一个字符串x, y, z, t,表示t时间点有一条记录,z=0表示x行y列的会议室有个工程师进入会议室了,z=1表示x行y列的房间有个工程师离开会议室了。
    假设一开始所有会议室里都是没人的。
    1 <= n, m <= 500
    1 <= k <= 100,000
    t是HH:MM:SS.SSS的形式,其中HH表示小时,MM表示分钟,SS.SSS表示秒数。(因为工程师有非常强大的时间观念,所以对于他们来说,时间是精确到0.001秒的)
    数据保证t在18:00:00.000到23:59:59.999之间,且没有两条记录的时间是完全一样的。数据保证记录以t升序的形式给出。
    1 <= x <= n
    1 <= y <= m
    z∈{0, 1}
    数据保证没有从空会议室离开的情况。
    数据保证所有的时间格式合法。HH,MM均为长度为2的字符串,SS.SSS为长度为6的字符串。
    

    输出描述:

    输出n行每行m个整数,第i行第j列表示在亮灯数最多的时刻,第i行第j列的会议室的亮灯情况,1表示亮着,0表示没亮。
    如果存在多次亮灯数最多的时刻,输出最后一次时的情况。
    示例1

    输入

    2 2 4
    1 1 0 18:00:00.000
    1 1 1 20:00:00.000
    1 1 0 18:00:01.000
    1 2 0 18:00:02.000

    输出

    11
    00

    参考代码:


    #include<iostream>
    #include<stdio.h>
    #include<queue>
    #include<stack>
    #include<string.h>
    #include<cmath>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    struct t
    {
        t(){}
        t(int a,int b,int c,int d)
        {
            h=a;m=b;s=c;ms=d;
        }
        int h;//小时
        int m;//分钟
        int s;//秒
        int ms;//毫秒
        int x;//行数
        int y;//列数
        int z;//表示进入还是离开
        bool operator<(struct t&t2)
        {
            if(h!=t2.h)return h<t2.h;
            else
            {
                if(m!=t2.m)return m<t2.m;
                else
                {
                    if(s!=t2.s)return s<t2.s;
                    else
                    {
                        return ms<t2.ms;
                    }
                }
            }
        }
    }a[100010];
    int room[510][510];//动态记录每个会议室工程师的数目
    int state[510][510];//保存亮的会议室数目最大时的状态
    int main()
    {
        //freopen("in.txt","r",stdin);
        int n,m;int k;
        scanf("%d%d%d",&n,&m,&k);
        int ma=0;//即max,保存亮着的会议室的数目最大值
        char buf[20];
        for(int i=0;i<k;i++)
        {
            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
            cin>>buf;
            a[i].h=(buf[0]-'0')*10+(buf[1]-'0');
            a[i].m=(buf[3]-'0')*10+(buf[4]-'0');
            a[i].s=(buf[6]-'0')*10+(buf[7]-'0');
            a[i].ms=(buf[9]-'0')*100+(buf[10]-'0')*10+(buf[11]-'0');
        }
        sort(a,a+k);
        int cnt=0;
        for(int i=0;i<k;i++)
        {
            if(a[i].z==0&&room[a[i].x][a[i].y]==0)
            {
                cnt++;//进入没人的会议室,当前人数加1
            }
            if(a[i].z==1&&room[a[i].x][a[i].y]==1)
            {
                cnt--;//离开只有自己的会议室,人数减1
            }
            if(a[i].z)room[a[i].x][a[i].y]--;//只要有人出去,对应会议室人数就减1
            else room[a[i].x][a[i].y]++;//只要有人进来,对应会议室人数就加1
            if(cnt>=ma)
            {
                memcpy(state,room,sizeof(room));//更新会议室状态
                ma=cnt;//更新最大值
            }
        }


        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(state[i][j])cout<<1;
                else cout<<0;
            }
            cout<<endl;
        }
        return 0;
    }

























  • 相关阅读:
    spring与springmvc父子容器
    spring容器BeanFactory简单例子
    spring整体架构
    css中".",",",“~”和“>”符号的意义
    CSS中的块级元素与行级元素
    java反射和动态代理
    thymeleaf的fragment例子
    编写一个简单的 JDBC 程序
    http://localhost/ 或 http://127.0.0.1/ 报错:HTTP 404 的解决办法
    教你如何清除 MyEclipse/Eclipse 中 Web Browser 和 Switch Workspace 的历史记录
  • 原文地址:https://www.cnblogs.com/linruier/p/9485177.html
Copyright © 2020-2023  润新知