阿迪看医生

【问题描述】

  这几天同学们总是对阿迪议论纷纷,这使得他很烦恼,似乎产生了一些抑郁,头也有点痛,打不起精神,他只好去看医生。然而,他只有去看过 n 个医生之后才能确诊病情,每个医生都需要上一个医生的诊断结果,因此他必须按顺序去预约每个医生,也就是说,他必须先去看医生1,然后再去看医生2,然后是医生3,等等。只有到最后一个医生那里才能确诊,且每天只能看一个医生。

  从今天开始,每个医生都有一个固定的出诊安排表,医生 i 在第 si 天看病人,然后在之后的每个第 di 天看诊。因此,他只在 si、si+di、si+2di、... 这些天工作。

  预约每个医生有些困难,他想知道看完所有医生至少需要多少天?

【输入形式】

   输入的第一行一个正整数 n ,表示医生的数量。

   接下来的 n 行,每行两个正整数 si 和 di,表示第 i 个医生的工作情况。

【输出形式】

   输出一行一个整数,表示阿迪看完最后一个医生的天数。

【样例输入】
3
2 2
1 2
2 2

【样例输出】

4

【样例说明】

第1位医生从第2天开始看病,然后在第4、6、8…天看诊

第2位医生从第1天开始看病,然后在第3、5、7…天看诊

第3位医生从第2天开始看病,然后在第4、6、8…天看诊

因此,阿迪可以在第2天去看第1位医生,然后在第3天去看第2位医生,第4天看第3位医生。

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int a[n][2];   //定义二维数组a存储每位医生的si和di
	for(int x=0;x<n;x++)  //输入数据
	{
		for(int y=0;y<2;y++)
		{
			cin>>a[x][y];
		}
	}
	int time=a[0][0];  //定义看完全部医生的总天数time,赋第一个医生的天数值
	for(int i=1;i<n;i++)  //循环进行每个医生的看的情况判断
	{
		int t=1,ti=0;   //定义间隔次数t,进行过程中的医生看病天数ti
		if(a[i][0]>time) time=a[i][0];
		//当后续的医生开始看病的时间比看到前一个医生的总天数大时,直接赋值
		else  //当后续的医生开始看病的时间比看到前一个医生的总天数少时
		{
			while(1)  //永真循环
			{
				ti=a[i][0]+t*a[i][1];  //用ti记录医生看病天数
				if(ti>time)  //ti比看到前一个医生的总天数大时
				{
					time=ti;  //赋值
					break;  //跳出循环
				}
				else t++;   //否则,间隔加一,继续循环
			}
		}
	}
	cout<<time;
	return 0;
}
### PL/0 编译原理概述 PL/0 是一种用于教学目的的小型编程语言,由 Niklaus Wirth 设计。该语言及其编译器的设计旨在简化编译原理的教学过程。PL/0 的编译程序为每一条 PL/0 源程序的可执行语句生成后缀式目标代码[^1]。 #### 词法分析 词法分析阶段的任务是从输入源码中读取字符流并将其转换成一系列有意义的标记(token)。这些标记可以是关键字、标识符、常数、运算符等。对于 PL/0 来说,常见的标记包括 `begin`、`end`、`if`、`then` 等关键字;变量名作为标识符;整数值作为常数;加号 (`+`) 和减号 (`-`) 作为算术运算符。 ```python def lexer(source_code): tokens = [] i = 0 while i < len(source_code): char = source_code[i] if char.isdigit(): num = "" while i < len(source_code) and (source_code[i].isdigit() or source_code[i] == '.'): num += source_code[i] i += 1 tokens.append(('NUMBER', float(num))) continue elif char.isalpha(): word = "" while i < len(source_code) and source_code[i].isalnum(): word += source_code[i] i += 1 if word in keywords: tokens.append(('KEYWORD', word)) else: tokens.append(('IDENTIFIER', word)) continue # Handle operators, punctuation etc. i += 1 return tokens ``` #### 语法分析 语法分析基于上下文无关文法规则来解析由词法分析产生的标记序列。通过构建抽象语法树(AST),能够更好地表示程序结构。自顶向下或自底向上的方法都可以用来完成这一工作,在某些情况下还会涉及到预测分析表或者 LR 分析技术的应用[^2]。 #### 中间代码生成 一旦建立了 AST 或者其他形式的数据结构之后,则可以根据特定策略将它们转化为更易于处理的形式——即中间表示(IR)。对于简单的解释性语言来说,这一步骤可能不是必需的;但对于像 PL/0 这样的编译型语言而言却是至关重要的环节之一。通常会使用三地址码(TAC)或是四元组(quadruple)等形式来进行编码。 #### 目标代码生成 最后一步就是根据 IR 创建机器指令或者是某种虚拟机所理解的目标代码。由于 PL/0 主要是为了教育用途设计的语言,因此其实际运行环境往往是一个模拟出来的栈式计算机模型。这意味着最终输出的是类似于汇编级别的伪指令集合,而不是真正的二进制文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值