网易笔试和百度撞车,共有4道编程题,我是听其他答网易的同学说的题意,想了想思路。
第一题
题意
签到题,给出一句话,比如“How are you”,反转输出,如“you are How”。
思路
呃呃呃。
第二题
题意
给出n个数字,找出有多少组“三个数的最大公约数为1”。
思路
找出多少组“两个互质的数字”是用莫比乌斯反演,三个数,抱歉,没想到怎么做。据说暴力能过百分之50数据。
第三题
题意
有n个人要做过山车,过山车有限重,最多只能承受m公斤,给出他们每个人的体重,现在要给这n个人排好队,依次上过山车,如果挨着的两个人的体重之和小于m,则这两个人必须上同一辆过山车,否则单人上一辆过山车(注:不存在单人体重超过过山车限重),问最坏情况下,要安排多少辆过山车。
思路
贪心,将人的体重从小到大排序,依次上过山车,对于每个上车的人在所有后面的人中找到第一个与其体重之和大于限重的人,插到这个上车的人身后,如果不存在与其体重之和大于限重的人,则不进行插队操作,按规则上车即可。
第四题
题意
砸金蛋,金蛋顺序排列,每个金蛋有价值 m i m_i mi,砸第 i i i个金蛋可获得 m i − 1 × m i × m i + 1 m_{i-1} \times m_{i} \times m_{i+1} mi−1×mi×mi+1的金钱,然后第 i i i个金蛋相当于消失,继续砸别的,问最大化收益是多少。
思路
区间dp,用dp[i][j]表示从第i个金猪到第j个金猪的最大收益,则:
d
p
[
i
]
[
j
]
=
m
a
x
(
d
p
[
i
]
[
k
]
+
d
p
[
k
]
[
j
]
+
m
i
×
m
k
×
m
j
)
dp[i][j]=max (dp[i][k]+dp[k][j]+m_i \times m_k \times m_j)
dp[i][j]=max(dp[i][k]+dp[k][j]+mi×mk×mj)