【2020算法练习一】笔试算法题 快手2020校园招聘秋招笔试--算法A试卷

本文探讨了解一元一次方程的正整数解的算法,并提出了一种求解最大锻炼效果的健身策略。通过编程实现,介绍了如何使用Python的eval函数巧妙解决方程问题,以及设计贪心算法确定最佳健身器材组合。

1.求解一元一次方程的正整数解

解方程在线做题

输入描述:

输入一行表示该一元一次方程,其中未知数为X,方程包含加法、减法、乘法。
字符串长度少于20个字符,保证为合法方程。
所有整数绝对值不超过10000000。

输出描述:

如果X有唯一正整数解,输出该答案。如果解为非正整数、不存在或解不唯一,输出-1。
示例1

输入
2*X=6
输出
3

示例2

输入
X+2*X=3*X
输出
-1
说明解不唯一

参考代码:

eq = input()
eq1 = eq.replace("=","-(") + ")" # 将等式进行了变形,生成了一个结果为0的算式
c = eval(eq1, {
   
   'X': 1j})# 并将x = 1j代入算式,然后计算j的值即可得到X值
print(int(-c.real/c.imag))

eval是Python的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果。想象一下变量赋值时,将等号右边的表达式写成字符串的格式,将这个字符串作为eval的参数,eval的返回值就是这个表达式的结果。
eval(expression[, globals[, locals]])
参数

  • expression – 表达式。
  • globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
  • locals – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

这其实是算是一种投机取巧的方法,因为其中不含复数,所以假设X是负数,进行求解,如果这个算式中可以有虚部,就不能用这个方法了
用虚数1j代替X,让eval把X作为数计算,注意一定写1j才能被当成数
计算得到aj+b,由于这个式子我们知道等于0
方程的解就是-b/a,也就是-实部/虚部

2.[编程题]健身

在线测试网址
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 128M,其他语言256M
因为公司有免费健身福利,快手程序员老铁们都很爱健身,而且他们健身时像工作一样充满效率。
他们把健身过程神奇的简化了出来:健身有N种锻炼方式可选,器材可看成在一条直线上。
每种锻炼方式距门口Xi米,因为有的器材上可以支持多种锻炼方式,因此有可能出现两种锻炼方式的距离是一样的,即Xa = Xb。
老铁们一进健身房门口就开启健身形态,每走1米,就能获得1点锻炼效果值,而每种锻炼方式也有Ei的效果值,锻炼的过程就是从门口走到某种锻炼方式锻炼,然后到下一个方式锻炼,最后返回门口的过程。需要注意的是,锻炼过程中老铁们不会为了获得效果而刻意走回头路

老铁们很想知道如果想选择某几种锻炼方式,怎样获得最大锻炼效果。
输入描述:
第一行N,表示锻炼方式的个数
第二行N个整数,表示每种锻炼方式距门口的距离
第三行N个整数,表示每种锻炼方式的效果值

输出描述:
N个整数,第k行表示选择k种锻炼方式时获得的最大锻炼效果
输入例子1:
5
1 2 3 4 5
1 1 1 1 1
输出例子1:
11
12
13
14
15
例子说明1:
对于样例第一行,老铁选择去第5种锻炼方式,考虑来回路程,一共获得5+1+5点锻炼效果值

思路:
第一,不走回头路;
其次,要求最大; 可以看作一种贪心算法,随着贪心的增加,distance的增幅效果逐渐减小,所以distance和exp的增量是一个重要的参数
所以应当 尽可能大的距离*2+效果,即算出全部的距离+效果的值,取最大 ,取前k-1个最大效果

算法:

对于选k个建身器材,先选k-1个value最大的器材,再从剩下的里面找出(2d+value)最大的器材A。如果器材A的d比前面选的k-1个器材要大,那么最后一个器材就选A;
否则,就选value第k大的器材。(因为只有一个器材会影响最终练习效果的关于距离的部分)
这样可以保持训练效率最大化。

思路解析:
ei是能量,dist是距离
要求解 m a x ( e 1 + e 2 + e 3 + … + e n ) + m a x ( d i s t ∗ 2 ) max(e_1+e_2+e_3+…+e_n)+max(dist*2) max(e1+e2+e3++en)+max(dist2)
而dist和 e i e_i ei有关,
即求解 m a x ( e 1 , e 2 , e 3 + e n − 1 ) + m a x ( e n ) + m a x ( d i s t ∗ 2 ) max(e_1,e_2,e_3+e_{n-1})+max(e_n)+max(dist*2) max(e1,e2,e3+en1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值