美團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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章