OJ刷题记录:柜台服务 题目编号:453

柜台服务 题目编号:453

题目要求:
编写一个商店柜台接待客人的程序,现在只有一个柜台可以接待客人,在同一时间只能接待一个客人,接待每个客人都需要花费一定的服务时间,现在有一张表,记录顾客到来的时间和每个顾客要占用的服务时间,如果顾客来的时候柜台正在接待客人或者顾客前面还有等待着的顾客,顾客就需要等待,你需要计算出顾客等待的最长时间。

输入描述
输入数据有多组。

每组输入数据,第一行为一个整数n(1<=n<=50),表示有n名顾客。第二行是n个整数c[n],每位顾客在ci时刻到来,c[n]是非递减的一个序列。第三行是n个整数t[n],对应第二行的顾客接受服务需要t[i](1<=t[i]<=15)分钟。

输出描述
每组数据对应一行输出,为等待的最长时间。

输入样例
3
3 3 9
2 15 14
1
182
11
输出样例
11
0

解题思路:
主要是需要弄懂怎么计算当前顾客的等待时长。
第一个顾客的等待时长肯定为 0 。
而除了第一个顾客以外,其他的顾客需要等待的时长可以通过他到达的时间和上一个顾客离开(即等待完成并且接受服务完成)的时间来判断:如果当前的顾客到达的时间小于上一个顾客离开的时间,即当前顾客在上一个顾客还未离开时到达,则当前顾客需要等待,否则不用等待,等待时长为 0,并且 当前顾客需要等待的时长 = 上一个顾客离开的时间 - 当前顾客到达的时间。即
当前顾客需要等待的时长 =
(上一个顾客的到达时间 + 上一个顾客等待的时长 + 上一个顾客接受服务的时长)- 当前顾客到达的时间。

弄懂了主要计算思路,然后就是程序的代码实现。
我们可以使用数组或者结构体,在输入时分别存储每一个顾客对应的到达时间和接收服务的时长。然后计算出每一个成员需要等待的时长,存放在另一个结果数组中。输出结果数组元素中的最大值即可。

通关代码:

#include <iostream>

using namespace std;

int main() {
    
    
	int n;
	int time[51];
	int duration[51];
	int needWait[51];
	
	while (cin >> n) {
    
    
		
		for (int i = 0; i < n; i++) {
    
    
			cin >> time[i];
		}
		for (int i = 0; i < n; i++) {
    
    
			cin >> duration[i];
		}	
		
		needWait[0] = 0;
		
		for (int i = 1; i < n; i++) {
    
    
			if ((time[i - 1] + duration[i - 1] + needWait[i - 1] - time[i]) > 0) {
    
    
				needWait[i] = time[i - 1] + duration[i - 1] + needWait[i - 1] - time[i];
			} else {
    
    
				needWait[i] = 0;
			}
		}
		
		for (int i = 1; i < n; i++) {
    
    
			if (needWait[i] > needWait[0]) {
    
    
				needWait[0] = needWait[i];
			}
		}
		
		cout << needWait[0] << endl;		
	}
	
	return 0;
}

毕。

猜你喜欢

转载自blog.csdn.net/weixin_45711556/article/details/108534857