UVA 212 - Use of Hospital Facilities

有坑的有技巧的题目。首先来谈谈容易被坑到的几个地方:第一,记得考虑输入的时候人数为零的情况;第二,进入康复室的床位的排序,首先是按照病人从手术室出来的时间(注意是出来的时间,不能加入从手术室到康复室的路上的时间)与此时康复室的时间进行比较,如果从手术室出来的时间小于等于(注意是小于等于)康复室的可用时间,那么就为该病人分配床位,否则就不分配;第三点,从手术室出来的病人首先按照出手术室的时间进行排序,如果时间相同那么就按照所出手术室的编号进行排序。

技巧:时间全部化为分钟,更好处理;同时,注意到题目当中的一句话: The number of recovery room beds specified in any configuration will be sufficient to handle patients arriving from surgery (No queuing of patients for recovery room beds will be required). 说明,每一位出手术室的病人都会被安排到床位而不需要进行等待,那么病人在手术室的时间、从手术室到康复室的时间以及在康复室治疗的时间都是连续的,那么在一开始就可以直接进行计算,后期直接处理床位的分配即可,这样就会方便很多(我的代码没有利用到这一点,所以有点繁琐......),代码其实逻辑不复杂,先处理病人和手术室的关系再处理病人和康复室的关系,解析见注释

#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<iomanip>
using namespace std;

int sum_room, sum_bed, start_f, R2B, prep_r, prep_b, total_p;

struct opRoom{
	int total_time;//房间总的使用时间
	vector<pair<int, int>> serve_time;//房间的服务时间区间
	int next_start;//该房间下一次可以被使用的开始时间
	opRoom(){
		total_time = 0;
		next_start = 0;
	}
};

struct patient{
	int id;//病人信息录入时候的编号
	string name;//名字
	int time_r;//使用房间的时间
	int ser_b;//病人请求床位服务的时间
	int time_b;//使用床的时间
	int num_r;//使用的房间的编号
	int num_b;//使用的床的编号
	int ser_r;//病人请求房间服务的时间
	pair<int, int> room_t;//使用房间的时间区间
	pair<int, int> bed_t;//使用床的时间区间
};

struct bed{
	int total_time;//床位的使用总时间
	vector<pair<int, int>> serve_time;
	int next_start;//床位下一次可以被使用的时间
	bed(){
		total_time = 0;
		next_start = 0;
	}
};

bool compare1(patient a,patient b){
	if (a.ser_b != b.ser_b) return a.ser_b < b.ser_b;
	return a.num_r < b.num_r;
}

bool compare2(patient a, patient b){
	return a.id < b.id;
}

void put_Time(int hour,int minute,int t){
	cout << setw(2) << (t / 60) << ':' << setfill('0') << setw(2) << (t % 60) << setfill(' ');
}

void put_percent(double percent){
	percent *= 100;
	cout << fixed << setprecision(2) << percent << endl;
}

int main(){
	while (cin >> sum_room){
		int all_start = -1;//所有服务的开始时间
		int all_end = -1;//所有服务的结束时间
		cin >> sum_bed >> start_f >> R2B >> prep_r >> prep_b >> total_p;
		//房间的总数、床位的总数、所有服务的开始时间、从房间转移到床位的时间、房间的准备时间、床位的准备时间、总的用户数
		start_f *= 60;
		all_start = start_f;
		vector<opRoom> R_list(sum_room, opRoom());//房间列表
		vector<bed> B_list(sum_bed, bed());//床位列表
		vector<patient> per;//病人总数
		for (int i = 0; i < total_p; i++){
			patient temp;
			temp.id = i;
			cin >> temp.name;
			cin >> temp.time_r >> temp.time_b;
			temp.ser_r = start_f;
			per.push_back(temp);
		}
		for (int i = 0; i < total_p; i++){
			int index = -1;//房间的下标
			int time_f = 100000;
			for (int j = 0; j < sum_room; j++){
				if (R_list[j].next_start <= per[i].ser_r){
					time_f = per[i].ser_r;
					index = j;
					break;
				}
				if (R_list[j].next_start < time_f){
					time_f = R_list[j].next_start;
					index = j;
				}
			}
			pair<int, int> user_t;
			user_t.first = time_f;
			user_t.second = time_f + per[i].time_r;
			per[i].room_t = user_t;
			per[i].ser_b = user_t.second + R2B;
			per[i].num_r = index + 1;
			R_list[index].serve_time.push_back(user_t);
			R_list[index].next_start = user_t.second + prep_r;
			R_list[index].total_time += per[i].time_r;
		}
		sort(per.begin(), per.end(), compare1);
		for (int i = 0; i < total_p; i++){
			int index = -1;
			int time_f = 100000;

			string test = per[i].name;

			for (int j = 0; j < sum_bed; j++){
				if (B_list[j].next_start <= per[i].room_t.second){
					time_f = per[i].ser_b;
					index = j;
					break;
				}
				if (B_list[j].next_start < time_f){
					time_f = B_list[j].next_start;
					index = j;
				}
			}
			pair<int, int> user_b;
			user_b.first = per[i].ser_b;
			user_b.second = user_b.first + per[i].time_b;
			if (user_b.second > all_end) all_end = user_b.second;
			per[i].bed_t = user_b;
			per[i].num_b = index + 1;
			B_list[index].next_start = user_b.second + prep_b;
			B_list[index].serve_time.push_back(user_b);
			B_list[index].total_time += per[i].time_b;
		}
		sort(per.begin(), per.end(), compare2);
		cout << " Patient          Operating Room          Recovery Room\n";
		cout << " #  Name     Room#  Begin   End      Bed#  Begin    End\n";
		cout << " ------------------------------------------------------\n";
		for (int i = 0; i < total_p; i++){
			cout << setw(2) << (i + 1) << "  " << left << setw(10) << per[i].name << right << setw(2) << per[i].num_r
				<< "   ";
			int inHour, inMinute, outHour, outMinute;
			inHour = per[i].room_t.first / 60;
			inMinute = per[i].room_t.first % 60;
			outHour = per[i].room_t.second / 60;
			outMinute = per[i].room_t.second % 60;
			put_Time(inHour, inMinute, per[i].room_t.first);
			cout << "   ";
			put_Time(outHour, outMinute, per[i].room_t.second);
			cout << "     " << setw(2) << per[i].num_b << "   ";
			inHour = per[i].bed_t.first / 60;
			inMinute = per[i].bed_t.first % 60;
			outHour = per[i].bed_t.second / 60;
			outMinute = per[i].bed_t.second % 60;
			put_Time(inHour, inMinute, per[i].bed_t.first);
			cout << "   ";
			put_Time(outHour, outMinute, per[i].bed_t.second);
			cout << endl;
		}
		double total_service = all_end - all_start;
		cout << endl << "Facility Utilization\n";
		cout << "Type  # Minutes  % Used\n";
		cout << "-------------------------\n";
		for (int i = 0; i < R_list.size(); i++){
			cout << "Room " << setw(2) << (i + 1) << setw(8) << R_list[i].total_time << setw(8);
			double percent = R_list[i].total_time / total_service;
			if (R_list[i].total_time == 0) percent = 0;
			put_percent(percent);
		}
		for (int i = 0; i < B_list.size(); i++){
			cout << "Bed  " << setw(2) << (i + 1) << setw(8) << B_list[i].total_time << setw(8);
			double percent = B_list[i].total_time / total_service;
			if (B_list[i].total_time == 0) percent = 0;
			put_percent(percent);
		}
		cout << endl;
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值