某公司笔试题

本文介绍了一个用于计算特定阶梯序列最大蓄水量的算法实现,详细解释了算法逻辑,并提供了C++代码实现。算法通过遍历阶梯序列,找到每段序列中的最大高度,计算出每段可能的蓄水量,最终得出整个序列的最大蓄水量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大致是这样。有一排紧挨着的阶梯(假设阶梯有两侧封闭),可以用来收集雨水,比如一组数据{8,4,7,2,5,9}。求出该组阶梯最大的蓄水量

每个数据代表该容器当前的高度。蓄水量用高度表示


比如{8,4,7,2,5,9},4这个可以蓄水(8-4),7可以蓄水(8-7),2可以蓄水(8-2),5可以蓄水(8-5)

当时少考虑了一种情况是,不仅该数比两边的数小情况下可以蓄水,而且该数的左边只要有比该数大的,该数的右边只要有比该数大的便可以蓄水

(可以隔着,不连续的,这种情形当初就没有考虑到)

题目描述的不是很好。


先找到该序列中最大的数所在的索引即为max_index,然后在该索引往右找右边部分最大的数的索引r_index,然后先把max_index与r_index之间可以收集的雨水量相加。

更新index为r_index继续往右扫,找到index右边区间最大的索引还是记为r_index,把index与r_index之间的能收集的雨量相加,直至r_index超过数组上限。


max_index左边的操作与右边的操作类似, 用变量index存储max_index左边一直扫描找到左边区间最大的数的索引l_index,l_index与index之间可以收集的雨量进行相加。

更新index为l_index,index往左区间找到最大的数记为l_index,继续增加index与l_index之间的雨量。继续这个操作,直至l_index超过数组下限。


第一次寻找最大的需n次,最坏情形下最大元素右边区间(设右边区间数列长度为x)是个递减数列,右边的需寻找最大的依次为x-1,x-2,...1

(x-1)*x/2;

最大元素左边最坏情形是个递增数列,(长度为n-x-1)。左边需比较次数为(n-x-2),(n-x-3),..1


#include<iostream>
using namespace std;
int amount(int *A,int low,int high){
	int max_index=low;
	int max_elem=A[low];
	int r_max; //max element value 
	int r_index;//max element index in the subsection
	int l_max; //value of the max element  in the subsection
	int l_index;//max element index in the subsection
	int index;//max element index in the section
	int res=0;
	for(int i=low;i<=high;i++){
		if(A[i]>max_elem){
			max_elem=A[i];
			max_index=i;
		}
	}
	r_index=max_index+1;
	index=max_index;
	l_index=max_index-1;
	while(r_index<=high){
		r_max=A[r_index];
		for(int i=r_index;i<=high;i++){
			if(A[i]>r_max){
				r_index=i;
				r_max=A[i];
			}
		}
		for(int j=index+1;j<r_index;j++)
			res+=r_max-A[j];
		index=r_index;
		r_index++;
	}
	while(l_index>=low){
		l_max=A[l_index];
		for(int i=l_index;i>=low;i--){
			if(A[i]>l_max){
				l_max=A[i];
				l_index=i;
			}
		}
		for(int j=l_index+1;j<index;j++)
			res+=l_max-A[j];
		index=l_index;
		l_index--;
	}
	return res;
}
int main(){
	int A[]={8,7,5,4,3,6};
	cout<<amount(A,0,5);
}


某公司雇员(Employee)包括经理(Manager),技术人员(Technician)销售员(Salesman)。开发部经理(DeveloperManger),既是经理也是技术人员。销售部经理(SalesManager),既是经理也是销售员。 以Employee类为虚基类派生出Manager,TechnicianSalesman类;再进一步派生出DevelopermanagerSalesmanager类。 Employee类的属性包括姓名、职工号、工资级别,月薪(实发基本工资加业绩工资)。操作包括月薪计算函数(pay()),该函数要求输入请假天数,扣去应扣工资后,得出实发基本工资。 Technician类派生的属性有每小时附加酬金当月工作时数,及研究完成进度系数。业绩工资为三者之积。也包括同名的pay()函数,工资总额为基本工资加业绩工资。 Salesman类派生的属性有当月销售额酬金提取百分比,业绩工资为两者之积。也包括同名的pay()函数,工资总额为基本工资加业绩工资。 Manager类派生属性有固定奖金额业绩系数,业绩工资为两者之积。工资总额也为基本工资加业绩工资。 而DeveloperManager类,pay()函数是将作为经理作为技术人员业绩工资之的一半作为业绩工资。 SalesManager类,pay()函数则是经理的固定奖金额的一半,加上部门总销售额与提成比例之积,这是业绩工资。 编程实现工资管理。特别注意pay()的定义调用方法:先用同名覆盖,再用运行时多态。
工资发放系统 某公司按月给其雇员发放工资,该公司有4种雇员:  固定薪金的雇员:不管工作多长时间,总拿固定月薪;(但如果请假,要扣除相应的薪金,请假次数×每次扣除金额30)  小时工:以小时计算,加上加班费;(每月基本工作时间为160小时,其余为加班时间)  销售员:按销售收入提成计算;(每月基本销售额度为30000元,低于此额度,在月薪里扣除少于30000部分的千分之二)  带薪销售员:底薪加上销售收入提成(要求同上,若有请假,也要扣除相应的薪金) 如果雇员的生日所在的月份在本月,那么公司无条件补贴200元。 设计一工资发放系统,完成各种工资的计算,并实现以下功能: 1) 初始化系统 创建存储该公司职工信息的存储系统(Employee.dat),并进行职工信息的输入,注意:公司的职工编号由系统按顺序自动生成,并且员工号一旦分配好就不可以再修改! 第一次运行系统,根据系统提示从键盘输入员工的相应信息进行初始化操作,并保存至Employee.dat文件中。以后每次运行程序,初始化时都从文件Employee.dat中读取员工数据即可。 2) 职工信息输出 要求可以输出: 某类职工当月的薪水发放信息 分类输出全体职工当月的薪水发放信息 某一名职工当月的薪水发放信息 格式如下: ******************************** 固定薪金职员********************************* 编号 姓名 出生年月 工种 奖励薪金 固定月薪 请假天数 应扣 实发工资 是否领取 **********************************计时职员*********************************** 编号 姓名 出生年月 工种 奖励薪金 工作时长 时薪 加班时长 实发工资 是否领取 **********************************普通销售员*********************************** 编号 姓名 出生年月 工种 奖励薪金 销售额 提成比例 应扣 实发工资 是否领取*********************************带薪销售员************************************ 编号 姓名出生年月工种奖励薪金固定月薪销售额提成比例请假天数应扣实发工资是否领取 3) 添加职工 通过键盘输入相应的职工信息,添加职工,并保存至Employee.dat文件中。 4) 删除职工 通过输入职工的工号,首先输出要删除的职工相应的信息,经确认后删除,要考虑职工不存在的情况。删除后保存至Employee.dat文件中。 5) 修改信息 要求可以修改: 除编号外的所有职工信息,包括工种以及由修改工种带来的各项操作 修改某一类工种的信息,如销售人员的提成比例,统一提高0.05; 输出修改前的职工信息,经确认后修改后,输出修改后的职工信息,考虑职工不存在的情况,修改后保存至Employee.dat文件中。 6) 工资发放 通过输入职工号方式,输出查询到的职工相应的信息,经确认发放工资,将员工是否领取工资信息设置为是(即真),考虑所要查询的职工编号不存在已经发放过工资的情况。 7) 保存退出 通过确认,保存修改的信息至文件Employee.dat中,退出系统,结束运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值