1026 Table Tennis (30 分)最后一个测试点没过,已考虑roundup

EasonDongH 2019-04-27 11:57:58
如题,自己Debug很长时间未发现哪里错了,只能求助于大虾们指教了!第一个解决的留下微信或支付宝收款码,略表心意!




#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;
}
...全文
261 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
SDUHXP 2021-03-07
  • 打赏
  • 举报
回复
感谢,顺利的解决了我的问题。最后一个测试点,要保证查找队列中下一个vip客户时,要保证该vip客户并没有被服务过。
xucee 2020-04-20
  • 打赏
  • 举报
回复
兄弟帮你解决了还要不 看你发帖的时间有点久远了
进击的per 2020-03-16
  • 打赏
  • 举报
回复
53行if的条件改成nodes[j].Tag == 1改成nodes[j].Tag == 1 && nodes[j].HasServered != 1就可以了,就是楼上那位大哥说的那样
进击的per 2020-03-16
  • 打赏
  • 举报
回复

#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;
}
--zjy 2020-03-12
  • 打赏
  • 举报
回复
引用 3 楼 79C0 的回复:
请问你解决了吗?我也是最后一个过不了,搞了一两天了
你看我的回复
--zjy 2020-03-12
  • 打赏
  • 举报
回复
你现在过了吗? 如果当前是VIP桌子的话,队列中的访问过的VIP不能在访问了,所以加个判断就可以了
79C0 2020-01-16
  • 打赏
  • 举报
回复
请问你解决了吗?我也是最后一个过不了,搞了一两天了
EasonDongH 2019-04-30
  • 打赏
  • 举报
回复
引用 1 楼 greex 的回复:
vertor 改为 list试过么
没有试过list,这会有关系吗
greex 2019-04-29
  • 打赏
  • 举报
回复
vertor 改为 list试过么

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧