1014. Waiting in Line

比较好的思路如下:

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int K=1004,N=22;
int cost[K],done[K],sum[N],n,m,k,q;
queue<int>que[N];
void conduct(){
  int i=0;
  for(;i<n*m &&i<k;++i){
    sum[i%n]+=cost[i];  done[i]=sum[i%n];
    que[i%n].push(i);
  }
  for(;i<k;++i){
    int th;
    for(int mmin=1<<30,j=0;j<n;++j)
      if(done[que[j].front()]<mmin)
	mmin=done[que[th=j].front()];
    sum[th]+=cost[i];  done[i]=sum[th];
    que[th].pop();  que[th].push(i);
  }
}
int main(){
  cin>>n>>m>>k>>q;
  for(int i=0;i<k;++i) cin>>cost[i];
  conduct();
  while(q--){
    int no;cin>>no;--no;
    if(done[no]-cost[no]>=540) printf("Sorry\n");
    else printf("%02d:%02d\n",8+done[no]/60,done[no]%60);
  }
}
在这种方式中,最早出队的那个队列并非累计服务时间最少的那个队列。

比较坏的思路如下

#include<vector>
#include<climits>
#include<iostream>
#include<list>
using namespace std;
const int N=1003;

int use[N],leave[N],serve[N],n,m,k,q,outline,lastleavetime;
struct node{int left,id;node(int a,int b):id(a),left(b){}};
typedef list<node> window;
int main(){
  cin>>n>>m>>k>>q;
  for(int i=0;i<k;++i)cin>>use[i];
  vector<window>que(n);
  while(outline<k && outline<n*m){
    que[outline%n].emplace_back(outline,use[outline]);
    outline++;}
  // find a man next to leave,and make him leave,refresh the lefttime in que,and make
  // the one outline to wait in line,if any.
  while(true){
    int mmin=INT_MAX,nth=-1;
    for(int i=0;i<n;++i)
      if(que[i].size() &&que[i].front().left<mmin)
	mmin=que[nth=i].front().left;
    if(nth==-1)break;
    auto x=que[nth].front();
    que[nth].pop_front();
    leave[x.id]=lastleavetime+x.left;
    lastleavetime=leave[x.id];
    if(que[nth].size())
      serve[que[nth].front().id]=lastleavetime;
    
    mmin=INT_MAX;int nth2=-1;
    for(int i=0;i<n;++i)
      if(que[i].size()){
	if(i!=nth)
	  que[i].front().left-=x.left;
	if(que[i].size()<mmin)
	  mmin=que[nth2=i].size();
      }//if(que[..
    if(outline<k) {que[nth2].emplace_back(outline,use[outline]);outline++;}
  }//while(true)
  while(q--){
    int nth;cin>>nth;--nth;
    if(serve[nth]>=540)printf("Sorry\n");
    else printf("%02d:%02d\n",8+leave[nth]/60,leave[nth]%60);
    
  }//while(q--..
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值