智能服药助手

智能看护中很重要的环节是安排需要服药的老年人的服药计划。

已知机器人需要照顾的某位老年人需要服用 N 种药物,但某些药物不宜间隔过短服用 —— 比如降糖药一般遵医嘱日服 3 次,两次之间需要间隔至少 4 小时。当需要服用的药物比较多,医嘱比较复杂时,如何保证每位老人的服药计划是安全合理的,就成为一个挑战。

本题给定一套服药计划,请你检查一下计划是否存在问题。

输入格式:

输入第一行给出两个整数 N,M(1≤N,M≤103),表示老人需要服用 N 种药物(药物种类从 1 到 N 编号),对应的服药计划有 M 条记录。

接下来首先在一行中给出 N 个用空格隔开的整数 Ti​ (−1≤Ti​≤100,Ti​=0),表示编号为 i 的药物需要间隔至少 Ti​ 个单位时间服用。如果 Ti​ 为 −1,则说明这种药物没有间隔要求。

接下来的 M 行,每行给出一条服药计划中的记录,格式为:首先给出两个非负整数 t 和 k (0≤t≤109,0≤k≤N),表示服药的时刻为 t,服用了 k 种药物;然后紧接着列出 k 个数,每个数对应 t 时刻要吃的药物种类的编号。一行中的数字之间以空格分隔。

题目保证:记录按照服药时刻 t 的递增顺序给出;每一时刻服用的药物种类各不相同。注意:同一种药物可能需要在不同的时刻重复服用。如果一位老人在 ti​ 时刻和 tj​ 时刻服用了同一种药物,则他服用的间隔时间为 ∣ti​−tj​∣。

输出格式:

按照输入顺序检查每一条记录中的每一种药物。如果在 Y 时刻不宜服用药物 X,则在一行中输出:

Don't take X at Y!

注意:老人收到提醒后会按照提醒不服用指定的药物。

输入样例:

10 6
1 2 3 4 5 -1 -1 -1 -1 -1
0 1 1
1 2 1 2
2 1 2
3 2 1 3
5 3 1 3 4
6 2 1 4

输出样例:

Don't take 2 at 2!
Don't take 3 at 5!
Don't take 4 at 6!

这题应该是模拟题,但是实现还是挺难想,主要是解决服药的时间间隔的处理,不吃和吃了。

还有对于t组数据用什么方式处理,这题用数组显然不太行,但是数组又特别让人容易想到。

ac代码:

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<vector>
#include<math.h>
#include<iomanip>
#include<set>
#include<queue>
#include<stack> 
#include<map>
using namespace std;
int n,t,tim[1000],last[1000],tt,k;//定义药种类,记录次数,每种药的时间,上一次的吃药时间,每次记录的时间和药物种数
int main()
{
	cin >> n>>t;
	
	for (int i = 1; i <= n; i++)
	{
		cin >> tim[i];
		last[i] = -105;//所有药物上一次服用时间默认为-105为了防止第一次吃不了
	}
	for (int i = 1; i <= t; i++)
	{
		cin >>tt>>k;
		while (k--)
		{
			int j;
			cin >> j;
			if (tim[j] == -1)//如果药没有服用时限要求,直接continue
				continue;
			if (tt - last[j] >= tim[j])//如果当前时间减上一次服用这种药的时间大于这种药的间隔
			{
				last[j] = tt;//更新这种药的上次服用时间
			}
			else//否则发出禁止服用警告,也不用更新时间了
			{
				cout << "Don't take " << j << " at " << tt << "!"<<endl;
			}
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值