1026 Table Tennis (30 point(s))

版权声明:听说这里让写版权声明~~~ https://blog.csdn.net/m0_37691414/article/details/86659782

题解

模拟题,详细见代码。

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
const int INF = 0x3f3f3f3f;
struct player {
	int arrive, start = 21 * 3600, time; // 到达时间,开始时间, 玩耍时间 
	bool vip; // vip与否 
}persontemp; 
struct tablenode {
	int end = 8 * 3600, num; // 空闲时间
	bool vip;  //vip与否 
};
vector<player> person;
vector<tablenode> table;
bool cmp1(const player& a, const player& b) {
	return a.arrive < b.arrive; 
}
bool cmp2(const player& a, const player& b) {
	return a.start < b.start;
}
void alloctable(int personid, int tableid) {
    if(person[personid].arrive <= table[tableid].end)
        person[personid].start = table[tableid].end;
    else
        person[personid].start = person[personid].arrive;
    table[tableid].end = person[personid].start + person[personid].time;
    table[tableid].num++;
}
int findnextvip(int vipid) {
    vipid++;
    while(vipid < person.size() && person[vipid].vip == false) vipid++;
    return vipid;
}
int main() {
	int n, k, m, viptable;
    scanf("%d", &n);
    for(int i = 0; i < n; ++i) {
    	int h, m, s, t, flag;
        scanf("%d:%d:%d %d %d", &h, &m, &s, &t, &flag);
        persontemp.arrive = h * 3600 + m * 60 + s;
        if(persontemp.arrive >= 21 * 3600) continue;
        persontemp.time = t <= 120 ? t * 60 : 7200;
        persontemp.vip = ((flag == 1) ? true : false);
        person.push_back(persontemp);
	}
	scanf("%d%d", &k, &m);
    table.resize(k + 1);
    for(int i = 0; i < m; i++) {
        scanf("%d", &viptable);
        table[viptable].vip = true;
    }
    sort(person.begin(), person.end(), cmp1);
    int i = 0, vipid = -1;
    vipid = findnextvip(vipid);
   	while(i < person.size()) {
        int index = -1, minendtime = INF;
        for(int j = 1; j <= k; j++) {
            if(table[j].end < minendtime) {
                minendtime = table[j].end;
                index = j;
            }
        }
        if(table[index].end >= 21 * 3600) break;
        if(person[i].vip == true && i != vipid) { // 是否已经为其分配桌子 
            i++;
            continue;
        }
        if(table[index].vip == true) { //
            if(person[i].vip == true) {
                alloctable(i, index);
                vipid = findnextvip(vipid);
                i++;
            } else {
                if(vipid < person.size() && person[vipid].arrive <= table[index].end) {
                    alloctable(vipid, index);
                    vipid = findnextvip(vipid);
                } else {
                    alloctable(i, index);
                    i++;
                }
            }
        } else {
            if(person[i].vip == false) {
                alloctable(i, index);
                i++;
            } else {
                int vipindex = -1, minvipendtime = INF;
                for(int j = 1; j <= k; j++) {
                    if(table[j].vip == true && table[j].end < minvipendtime) {
                        minvipendtime = table[j].end;
                        vipindex = j;
                    }
                }
                if(vipindex != -1 && person[i].arrive >= table[vipindex].end) {
                    alloctable(i, vipindex);
                    vipid = findnextvip(vipid);
                    i++;
                } else {
                    alloctable(i, index);
                    vipid = findnextvip(vipid);
                    i++;
                }
            }
        }
    }
    sort(person.begin(), person.end(), cmp2);
    for(i = 0; i < person.size() && person[i].start < 21 * 3600; i++) {
        printf("%02d:%02d:%02d ", person[i].arrive / 3600, person[i].arrive % 3600 / 60, person[i].arrive % 60);
        printf("%02d:%02d:%02d ", person[i].start / 3600, person[i].start % 3600 / 60, person[i].start % 60);
        printf("%d\n", (person[i].start - person[i].arrive + 30) / 60); //用round也行。 
    }
    for(int i = 1; i <= k; i++) printf("%d%c", table[i].num, i == k ? '\n' : ' ');
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37691414/article/details/86659782