又一道队列模拟题
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <set>
using namespace std;
struct Person{
int hour;
int minute;
int sec;
int last;
int total;
Person(){};
Person(int h,int m,int s,int l):hour(h),minute(m),sec(s),last(l*60){
total=h*3600+m*60+s;
}
bool operator < (const Person &p) const{
if(total>p.total)
return true;
else
return false;
}
};
struct Window{
int total;
Window(){};
Window(int _t):total(_t){}
bool operator < (const Window &w) const{
if(total>w.total)
return true;
else
return false;
}
};
int main(){
priority_queue<Person> person;
priority_queue<Window> windows;
int N,K;
scanf("%d%d",&N,&K);
int base=28800;
int top=61201;
int wait_total=0;
for(int i=0;i<K;i++){
windows.push(Window(base));
}
int h,m,s,l;
for(int i=0;i<N;i++){
scanf("%d:%d:%d%d",&h,&m,&s,&l);
person.push(Person(h,m,s,l));
}
int cnt=0;
Person p(0,0,0,0);
Window w;
while(!person.empty()){
p=person.top();
person.pop();
if(p.total>=top)
break;
cnt++;
w=windows.top();
windows.pop();
if(p.total<w.total){
wait_total+=w.total-p.total;
w.total+=p.last;
}
else{
w.total=p.total+p.last;
}
windows.push(w);
}
printf("%.1lf",wait_total/cnt/60.0);
return 0;
}
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long LL;
const int INF = 0x7FFFFFFF;
const int maxn = 1e3 + 10;
int n, m, t[maxn], a, b, c, d, ans, cnt;
struct point
{
int x, y;
point(int x = 0, int y = 0) :x(x), y(y){}
bool operator<(const point&a)const{ return x < a.x; }
}f[maxn * 10];
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
{
scanf("%d:%d:%d%d", &a, &b, &c, &d);
f[i] = point(a * 3600 + b * 60 + c, d * 60);
}
sort(f, f + n);
for (int i = 0; i < m; i++) t[i] = 480 * 60;
for (int i = 0; i < n; i++)
{
if (f[i].x >= 17 * 60 * 60) break;
int now = 0;
for (int j = 1; j < m; j++)
{
if (t[j] < t[now]) now = j;
}
if (t[now]>f[i].x) ans += t[now] - f[i].x;
t[now] = max(t[now], f[i].x) + f[i].y;
cnt++;
}
if (cnt) printf("%.1lf\n", ans / (60.0*cnt)); else printf("0.0\n");
return 0;
}