美团2018年CodeM大赛-初赛B轮 1.开关灯

题目描述 开关灯

美团的办公室一共有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 <map>
#include <ctime>
#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define N 600
#define K 200000
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int n, m, k, a[N][N];
struct qlz {
    int x, y, z;
    char s[20];
} l[K];
int read() {
    int p=0;
    char ch=getchar();
    while (ch<'0' || ch>'9') ch=getchar();
    while (ch>='0' && ch<='9') p=p*10+ch-'0', ch=getchar();
    return p;
}
bool cmp(qlz a, qlz b) {
    return strcmp(a.s,b.s)<0;
}
int main() {
    cin>>n>>m>>k;
    for (int i=1; i<=k; i++) {
        l[i].x=read();
        l[i].y=read();
        l[i].z=read();
        scanf("%s", l[i].s);
    }
    sort(l+1,l+1+k,cmp);
    int ans=0, cnt=0, p=0;
    for (int i=1; i<=k; i++) {
        if (l[i].z) {
            if (!(--a[l[i].x][l[i].y])) cnt--;
        } else {
            if (!(a[l[i].x][l[i].y]++)) cnt++;
            if (cnt>=ans) ans=cnt, p=i;
        }
    }
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++) a[i][j]=0;
    for (int i=1; i<=p; i++)
        if (l[i].z) --a[l[i].x][l[i].y];
        else ++a[l[i].x][l[i].y];
    for (int i=1; i<=n; i++) {
        for (int j=1; j<=m; j++)
            printf("%d", a[i][j]?1:0);
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lewyu521/article/details/80785396
今日推荐