PAT 甲级 1017. Queueing at Bank (25)
2017-08-12 19:39
513 查看
题目:点击打开链接
思路:1.在输入时,可将达到时间晚于17:00:00的客户排除,不计入名单;
2.先根据到达时间排序,将情况分为前K位和后K位(K为窗口数)达到两个部分:
1)对前K位达到,若在8:00:00前达到,则等待时间则为其到8:00:00的时间,这里的服务时间是8:00:00,若在8:00:00后到达则无等待时间,这里的服务时间是其达到时间;
2)对K位后,先将其之间的K为客户按照其离开时间排序(由于每次都对相应客户的前K位客户进行离开时间排序,最后整个向量排序都将根据离开时间排序,不必担心前面客户先到后出的情况发生),对排序后向前数第K位客户的离开时间作为标准,在此之前达到则有等待时间,否则等待时间为0;
3.注意客户数小于窗口数的情况。
代码:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<cstdio>
using namespace std;
int final_time=17*60*60;
int begin_time=8*60*60;
struct customer
{
int arr_time;
int p;
int ser_time;
int leave_time;
};
//根据达到时间排序
bool comp_arr(customer &a,customer &b)
{
return a.arr_time<b.arr_time;
}
//根据离开时间排序
bool comp_leave(customer &a,customer &b)
{
return a.leave_time<b.leave_time;
}
//计算秒数
int get_time(string s)
{
int t=0;
t=(s[6]-'0')*10+(s[7]-'0');
t+=((s[3]-'0')*10+(s[4]-'0'))*60;
t+=((s[0]-'0')*10+(s[1]-'0'))*60*60;
return t;
}
int main()
{
int N,K;
cin>>N>>K;
int i=0;
vector<customer> C;
string s;
int t,q;
customer cum;
for(;i<N;++i)
{
cin>>s>>q;
t=get_time(s);
if(t<=final_time) //在17:00:01之前到达的客户
{
cum.arr_time=t;
cum.p=q;
C.push_back(cum);
}
}
sort(C.begin(),C.end(),comp_arr); //根据到达时间排序
long long w_time=0; //总的等待时间
if(C.size()<=K) //人数小于等于窗口数
{
for(i=0;i<C.size();++i)
{
if(C[i].arr_time<begin_time) //在开始时间之前来,有等待时间
{
w_time+=begin_time-C[i].arr_time;
C[i].ser_time=begin_time;
}
else
{
C[i].ser_time=C[i].arr_time;
}
C[i].leave_time=C[i].ser_time+C[i].p*60;
}
}
else
{
for(i=0;i<K;++i) //前K位客户,到8:00即可服务
{
if(C[i].arr_time<begin_time) //在开始时间之前来,有等待时间
{
w_time+=begin_time-C[i].arr_time;
C[i].ser_time=begin_time;
}
else
{
C[i].ser_time=C[i].arr_time;
}
C[i].leave_time=C[i].ser_time+C[i].p*60;
}
for(;i<C.size();++i)
{
sort(C.begin()+i-K,C.begin()+i,comp_leave); //对于前K位用户排序
if(C[i].arr_time<C[i-K].leave_time) //客户早到
{
w_time+=C[i-K].leave_time-C[i].arr_time;
C[i].ser_time=C[i-K].leave_time;
}
else
{
C[i].ser_time=C[i].arr_time;
}
C[i].leave_time=C[i].ser_time+C[i].p*60; //离开时间计算
}
}
float per_time=w_time/(60.0*C.size());
printf("%.1f",per_time);
system("pause");
return 0;
}
思路:1.在输入时,可将达到时间晚于17:00:00的客户排除,不计入名单;
2.先根据到达时间排序,将情况分为前K位和后K位(K为窗口数)达到两个部分:
1)对前K位达到,若在8:00:00前达到,则等待时间则为其到8:00:00的时间,这里的服务时间是8:00:00,若在8:00:00后到达则无等待时间,这里的服务时间是其达到时间;
2)对K位后,先将其之间的K为客户按照其离开时间排序(由于每次都对相应客户的前K位客户进行离开时间排序,最后整个向量排序都将根据离开时间排序,不必担心前面客户先到后出的情况发生),对排序后向前数第K位客户的离开时间作为标准,在此之前达到则有等待时间,否则等待时间为0;
3.注意客户数小于窗口数的情况。
代码:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<cstdio>
using namespace std;
int final_time=17*60*60;
int begin_time=8*60*60;
struct customer
{
int arr_time;
int p;
int ser_time;
int leave_time;
};
//根据达到时间排序
bool comp_arr(customer &a,customer &b)
{
return a.arr_time<b.arr_time;
}
//根据离开时间排序
bool comp_leave(customer &a,customer &b)
{
return a.leave_time<b.leave_time;
}
//计算秒数
int get_time(string s)
{
int t=0;
t=(s[6]-'0')*10+(s[7]-'0');
t+=((s[3]-'0')*10+(s[4]-'0'))*60;
t+=((s[0]-'0')*10+(s[1]-'0'))*60*60;
return t;
}
int main()
{
int N,K;
cin>>N>>K;
int i=0;
vector<customer> C;
string s;
int t,q;
customer cum;
for(;i<N;++i)
{
cin>>s>>q;
t=get_time(s);
if(t<=final_time) //在17:00:01之前到达的客户
{
cum.arr_time=t;
cum.p=q;
C.push_back(cum);
}
}
sort(C.begin(),C.end(),comp_arr); //根据到达时间排序
long long w_time=0; //总的等待时间
if(C.size()<=K) //人数小于等于窗口数
{
for(i=0;i<C.size();++i)
{
if(C[i].arr_time<begin_time) //在开始时间之前来,有等待时间
{
w_time+=begin_time-C[i].arr_time;
C[i].ser_time=begin_time;
}
else
{
C[i].ser_time=C[i].arr_time;
}
C[i].leave_time=C[i].ser_time+C[i].p*60;
}
}
else
{
for(i=0;i<K;++i) //前K位客户,到8:00即可服务
{
if(C[i].arr_time<begin_time) //在开始时间之前来,有等待时间
{
w_time+=begin_time-C[i].arr_time;
C[i].ser_time=begin_time;
}
else
{
C[i].ser_time=C[i].arr_time;
}
C[i].leave_time=C[i].ser_time+C[i].p*60;
}
for(;i<C.size();++i)
{
sort(C.begin()+i-K,C.begin()+i,comp_leave); //对于前K位用户排序
if(C[i].arr_time<C[i-K].leave_time) //客户早到
{
w_time+=C[i-K].leave_time-C[i].arr_time;
C[i].ser_time=C[i-K].leave_time;
}
else
{
C[i].ser_time=C[i].arr_time;
}
C[i].leave_time=C[i].ser_time+C[i].p*60; //离开时间计算
}
}
float per_time=w_time/(60.0*C.size());
printf("%.1f",per_time);
system("pause");
return 0;
}
相关文章推荐
- PAT - 甲级 - 1017. Queueing at Bank (25)(模拟+排序)
- PAT甲级 1017. Queueing at Bank (25)
- PAT 甲级 1017. Queueing at Bank (25)
- PAT(甲级)1017. Queueing at Bank (25)
- 【PAT甲级】1017. Queueing at Bank (25)
- PAT(甲级)1017 . Queueing at Bank (25)
- 1017. Queueing at Bank (25)-PAT甲级真题(模拟)
- PAT甲级1017. Queueing at Bank (25)
- [PAT甲级]1017. Queueing at Bank (25)(银行办理业务平均等待时间)
- pat甲级1017. Queueing at Bank (25)
- PAT (Advanced) 1017. Queueing at Bank (25)
- PAT (Advanced Level) 1017. Queueing at Bank (25)
- 1017. Queueing at Bank (25)——PAT (Advanced Level) Practise
- 【PAT】1017. Queueing at Bank (25)【priority_queue的运用】
- PAT 1017. Queueing at Bank (25)(优先队列排队)
- PAT (Advanced Level) Practise 1017. Queueing at Bank (25)
- PAT (Advanced Level) Practise 1017. Queueing at Bank (25)
- [PAT]1017. Queueing at Bank (25)@Java
- 【PAT】1017. Queueing at Bank (25)
- pat 1017. Queueing at Bank (25)