3,881
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
struct node{
int Arrive_Time, Start_Time, Play_Time, Tag, HasServered;
bool operator <(const node& n){
return Arrive_Time < n.Arrive_Time;
}
};
bool cmp(const node& n1, const node& n2){
return n1.Start_Time < n2.Start_Time;
}
int round(int arrive,int start){
int wait = start-arrive;
int min = wait / 60;
if(wait%60 >= 30) ++min;
return min;
}
int main(){
int N, h, m, s, K, M, index, open_Time=8*3600, close_Time=21*3600, max_PlayTime=2*3600;
cin >> N;
vector<node> nodes(N);
for(int i=0; i<N; ++i){
scanf("%d:%d:%d", &h, &m, &s);
nodes[i].HasServered = 0;
nodes[i].Arrive_Time = h*3600+m*60+s;
scanf("%d %d", &nodes[i].Play_Time, &nodes[i].Tag);
nodes[i].Play_Time *= 60;
if(nodes[i].Play_Time > max_PlayTime)
nodes[i].Play_Time = max_PlayTime;
}
sort(nodes.begin(),nodes.end());
scanf("%d %d", &K, &M);
vector<int> Table_EmptyTime(K+1), Table_ServerPair(K+1, 0), isVIP_Table(K+1, false);
for(int i=0; i<M; ++i){
scanf("%d", &index);
isVIP_Table[index] = true;
}
for(int i=0; i<=K; ++i)
Table_EmptyTime[i] = open_Time;
for(int i=0, j; i<N; ++i){
if(nodes[i].HasServered == 1)
continue;
int nextEmptyTable_Index = 1, nextServeredPair_Index = i;
for(int k=2; k<=K; ++k){
if(Table_EmptyTime[k] < Table_EmptyTime[nextEmptyTable_Index])
nextEmptyTable_Index = k;
}
if(isVIP_Table[nextEmptyTable_Index]){// 如果当前空出来的是VIP桌
for( j=i; j<N && Table_EmptyTime[nextEmptyTable_Index]>=nodes[j].Arrive_Time; ++j){// 则看当前队列中是否有VIP
if(nodes[j].Tag == 1){
i = i - 1;
nextServeredPair_Index = j;
break;
}
}
}
else if(nodes[nextServeredPair_Index].Tag == 1){// 如果该成员是VIP,优先安排他使用VIP桌
for(j=1;j<=K;++j){
if(isVIP_Table[j] && Table_EmptyTime[j]<=nodes[nextServeredPair_Index].Arrive_Time){
nextEmptyTable_Index = j;
break;
}
}
}
nodes[nextServeredPair_Index].Start_Time = max(Table_EmptyTime[nextEmptyTable_Index],nodes[nextServeredPair_Index].Arrive_Time);
if(nodes[nextServeredPair_Index].Start_Time < close_Time)
++Table_ServerPair[nextEmptyTable_Index];
nodes[nextServeredPair_Index].HasServered = 1;
Table_EmptyTime[nextEmptyTable_Index] =nodes[nextServeredPair_Index].Start_Time + nodes[nextServeredPair_Index].Play_Time;
}
sort(nodes.begin(),nodes.end(), cmp);
for(int i=0; i<N && nodes[i].Start_Time<close_Time; ++i){
printf("%02d:%02d:%02d", nodes[i].Arrive_Time/3600, nodes[i].Arrive_Time%3600/60, nodes[i].Arrive_Time%3600%60);
printf(" %02d:%02d:%02d", nodes[i].Start_Time/3600, nodes[i].Start_Time%3600/60, nodes[i].Start_Time%3600%60);
//printf(" %d\n", round((nodes[i].Start_Time-nodes[i].Arrive_Time)/60.0));
printf(" %d\n", round(nodes[i].Arrive_Time,nodes[i].Start_Time));
}
for(int i=1; i<=K; ++i)
printf("%d%c", Table_ServerPair[i], i==K?'\n':' ');
return 0;
}
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
struct node {
int Arrive_Time, Start_Time, Play_Time, Tag, HasServered;
bool operator <(const node& n) {
return Arrive_Time < n.Arrive_Time;
}
};
bool cmp(const node& n1, const node& n2) {
return n1.Start_Time < n2.Start_Time;
}
int round(int arrive, int start) {
int wait = start - arrive;
int min = wait / 60;
if (wait % 60 >= 30) ++min;
return min;
}
int main() {
int N, h, m, s, K, M, index, open_Time = 8 * 3600, close_Time = 21 * 3600, max_PlayTime = 2 * 3600;
cin >> N;
vector<node> nodes(N);
for (int i = 0; i < N; ++i) {
scanf("%d:%d:%d", &h, &m, &s);
nodes[i].HasServered = 0;
nodes[i].Arrive_Time = h * 3600 + m * 60 + s;
scanf("%d %d", &nodes[i].Play_Time, &nodes[i].Tag);
nodes[i].Play_Time *= 60;
if (nodes[i].Play_Time > max_PlayTime)
nodes[i].Play_Time = max_PlayTime;
}
sort(nodes.begin(), nodes.end());
scanf("%d %d", &K, &M);
vector<int> Table_EmptyTime(K + 1), Table_ServerPair(K + 1, 0), isVIP_Table(K + 1, false);
for (int i = 0; i < M; ++i) {
scanf("%d", &index);
isVIP_Table[index] = true;
}
for (int i = 0; i <= K; ++i)
Table_EmptyTime[i] = open_Time;
for (int i = 0, j; i < N; ++i) {
if (nodes[i].HasServered == 1)
continue;
int nextEmptyTable_Index = 1, nextServeredPair_Index = i;
for (int k = 2; k <= K; ++k) {
if (Table_EmptyTime[k] < Table_EmptyTime[nextEmptyTable_Index])
nextEmptyTable_Index = k;
}
if (isVIP_Table[nextEmptyTable_Index]) {// 如果当前空出来的是VIP桌
for (j = i; j < N && Table_EmptyTime[nextEmptyTable_Index] >= nodes[j].Arrive_Time; ++j) {// 则看当前队列中是否有VIP
if (nodes[j].Tag == 1 && nodes[j].HasServered != 1) {
i = i - 1;
nextServeredPair_Index = j;
break;
}
}
}
else if (nodes[nextServeredPair_Index].Tag == 1) {// 如果该成员是VIP,优先安排他使用VIP桌
for (j = 1; j <= K; ++j) {
if (isVIP_Table[j] && Table_EmptyTime[j] <= nodes[nextServeredPair_Index].Arrive_Time) {
nextEmptyTable_Index = j;
break;
}
}
}
nodes[nextServeredPair_Index].Start_Time = max(Table_EmptyTime[nextEmptyTable_Index], nodes[nextServeredPair_Index].Arrive_Time);
if (nodes[nextServeredPair_Index].Start_Time < close_Time)
++Table_ServerPair[nextEmptyTable_Index];
nodes[nextServeredPair_Index].HasServered = 1;
Table_EmptyTime[nextEmptyTable_Index] = nodes[nextServeredPair_Index].Start_Time + nodes[nextServeredPair_Index].Play_Time;
}
sort(nodes.begin(), nodes.end(), cmp);
for (int i = 0; i < N && nodes[i].Start_Time < close_Time; ++i) {
printf("%02d:%02d:%02d", nodes[i].Arrive_Time / 3600, nodes[i].Arrive_Time % 3600 / 60, nodes[i].Arrive_Time % 3600 % 60);
printf(" %02d:%02d:%02d", nodes[i].Start_Time / 3600, nodes[i].Start_Time % 3600 / 60, nodes[i].Start_Time % 3600 % 60);
//printf(" %d\n", round((nodes[i].Start_Time-nodes[i].Arrive_Time)/60.0));
printf(" %d\n", round(nodes[i].Arrive_Time, nodes[i].Start_Time));
}
for (int i = 1; i <= K; ++i)
printf("%d%c", Table_ServerPair[i], i == K ? '\n' : ' ');
return 0;
}