智能看护中很重要的环节是安排需要服药的老年人的服药计划。
已知机器人需要照顾的某位老年人需要服用 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!
一、分析
1.值得注意的点:老人收到提示后不会吃药,所以不用更新时间
2.注意要看题目中的注意
#include<iostream>
#include<cstring>
#include<unordered_map>
using namespace std;
const int N=1e3+10;
//unordered_map <int,int> t;
int t[N],last[N];
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i )
{
int a;
cin>>a;
t[i]=a;
}
memset(last,-1,sizeof last);
while(m--)
{
int now,k;
cin>>now>>k;
for(int i=0;i<k;++i)
{
int med;cin>>med;
if(t[med]==-1) continue;
if(last[med]==-1) last[med]=now;
else {
if((now-last[med])<t[med])
//cout<<t[med]<<" "<<last[med]<<" "<<now<<endl;
cout<<"Don't take "<<med<<" at "<<now<<"!"<<endl;
}last[med]=now;
}
}
return 0;
}