day11

90 阅读2分钟

不要浪费金币

(10分)

哲哲最近在玩一个游戏,击杀怪物能获得金币 —— 这里记击杀第 i 个怪物获得的金币数量为 Pi​。

然而这个游戏允许拥有的金币数量是有上限的,当超过时,超过上限的部分就会被系统光明正大地吃掉,哲哲就拿不到了。

为了不浪费金币,哲哲决定,当下一个要击杀的怪物可获得的金币会导致自己拥有的金币数量超过上限时,就去消费一次,把自己已有的金币全部用完。

现在给定哲哲将要击杀的一系列怪物对应的金币数量,请你计算一下哲哲去消费了几次。

输入格式:

输入第一行是两个整数 N,M (1≤N≤103,1≤M≤106),表示击杀的怪物数量以及系统允许拥有金币数量的上限。

接下来一行是由空格隔开的 N 个数 Pi​(i=1,⋯,N),依次表示击杀第 i 个怪物能获得的金币数量。假设哲哲是按输入顺序击杀怪物的,并且每个 Pi​ 都是 不超过 106 的非负整数。

输出格式:

在一行中输出哲哲去消费的次数。

输入样例:

10 10
1 2 3 4 1 2 3 5 11 1

输出样例:

4

样例解释:

消费时间点为:第四个怪物击杀后、第七个怪物击杀后、第八个怪物击杀后、第九个怪物击杀后。

编译器

NO_COMPILER

代码

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

LL n,m;
LL a[1010]; 

int main()
{
	cin>>n>>m;
	LL now=0;
	LL ans=0;
	for (int i=1;i<=n;i++)
	{
		LL x;cin>>x;
		if (now+x>m)
		{
			ans++;
			now=0;
		}
		now+=x;
	}
	cout<<ans;
	return 0;
}

编译器输出

测试点结果测试点得分耗时内存
0答案正确54.00 ms600 KB
1答案正确14.00 ms452 KB
2答案正确14.00 ms480 KB
3答案正确14.00 ms444 KB
4答案正确15.00 ms444 KB
5答案正确14.00 ms484 KB

评测结果答案正确(10 分)

RC-u2

智能服药助手

(15分)

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

已知机器人需要照顾的某位老年人需要服用 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!

编译器

NO_COMPILER

代码

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N=1010;

int n,m;
LL t[N],last[N];

int main()
{
	cin>>n>>m;
	
	for (int i=1;i<=n;i++)	cin>>t[i];
	
	memset(last,-0x3f,sizeof(last));
	
	while(m--)
	{
		int now,k;cin>>now>>k;
		while(k--)
		{
			int x;cin>>x;
			if (now-last[x]<t[x])
			{
				printf("Don't take %d at %d!\n",x,now);
				continue;
			}
			else
			{
				last[x]=now;
			}
		}
	}
	
	return 0;
}