找不到哪里错了,有3个点不过
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int n,w;
struct mytime{
int hh,mm,ss;
};
struct node{
mytime come;
mytime start;
mytime fin;
int last;
}no[10010];
vector <int> window[110];
bool cmp(node a,node b){
if(a.come.hh!=b.come.hh){
return a.come.hh<b.come.hh;
}else{
if(a.come.mm!=b.come.mm){
return a.come.mm<b.come.mm;
}else{
return a.come.ss<b.come.ss;
}
}
}
//共有多少人成功办理业务,进队就成功办理业务了
int cnt=0;
//等待时间的总和
double ans=0;
//计算结束时间
mytime calfin(int last,mytime start){
if(last>60){
last=60;
}
mytime t;
t.ss=start.ss;
t.mm=(start.mm+last)%60;
t.hh=start.hh+(start.mm+last)/60;
return t;
}
//计算等待时间,化为秒
int callast(mytime come,mytime start){
int ans=0;
if(start.ss-come.ss<0){
start.mm--;
start.ss+=60;
}
if(start.mm-come.mm<0){
start.hh--;
start.mm+=60;
}
ans=start.ss-come.ss+(start.mm-come.mm)*60+(start.hh-come.hh)*60*60;
return ans;
}
//判断哪个time大小,prior小返回true,cur小返回false,相等返回false
bool compare(mytime prior,mytime cur){
if(prior.hh<cur.hh){
return true;
}else if(prior.hh==cur.hh){
if(prior.mm<cur.mm){
return true;
}else if(prior.mm>cur.mm){
return false;
}else{
if(prior.ss<cur.ss){
return true;
}else if(prior.ss>=cur.ss){
return false;
}
}
}else{
return false;
}
}
//找到最快结束的队伍
int findq(){
int ans=0;
mytime quick=no[ window[0][window[0].size()-1]].fin;
for(int i=1;i<w;i++){
if(!compare(quick,no[ window[i][window[i].size()-1]].fin)){
quick=no[ window[i][window[i].size()-1]].fin;
ans=i;
}
}
return ans;
}
//进队
void inq(int i){
mytime early;
early.hh=17;
early.mm=0;
early.ss=0;
if(compare(early,no[i].come)){
return;
}
for(int win=0;win<w;win++){
if(window[win].empty()){
window[win].push_back(i);
cnt++;
if(no[i].come.hh<8){
no[i].start.hh=8;
no[i].start.mm=0;
no[i].start.ss=0;
}else{
no[i].start=no[i].come;
}
no[i].fin=calfin(no[i].last,no[i].start);
ans+=callast(no[i].come,no[i].start);
return;
}
}
int curw=findq();
cnt++;
mytime rear=no[ window[curw][ window[curw].size()-1] ].fin;
no[i].start=rear;
no[i].fin=calfin(no[i].last,no[i].start);
ans+=callast(no[i].come,no[i].start);
window[curw].push_back(i);
return;
}
int main(){
freopen("in.txt","r",stdin);
scanf("%d %d",&n,&w);
for(int i=0;i<n;i++){
scanf("%d:%d:%d %d",&no[i].come.hh,&no[i].come.mm,&no[i].come.ss,&no[i].last);
}
sort(no,no+n,cmp);
for(int i=0;i<n;i++){
inq(i);
}
ans/=(double)cnt;
printf("%.1lf\n",ans/60);
return 0;
}