2019腾讯c++后台提前批笔试题

五个算法题。

第一题:

有n种硬币,面额分别为1~n,每种硬币都有无限个,假设要付款的金额为m。要求支付硬币数最少。为多少?

答:m/n+!!(m%n)   很简单的一个题

第二题:

一个数列:-1 2 -3 4 -5 6 。。。

询问q次,每次询问区间[l,r]的区间和,输出每个询问的答案.

答:

第1个和第2个加起来为1,第3,4个加起来也为1........

所以前i项和为:

i/2+(i&1)*i;

区间和可以用前i项和算出来了。

第三题:

牛妹有剪刀,石头,布(以0,1,2表示)三种卡片无限张。现在牛妹拿出n张排成一排。

然后你也拿出n张牌一一对应比对。若赢一局则获得一分。若你想得k分。

现在输入n,k和牛妹的n张牌分别是什么,你想要恰好得k分,有多少种方法。

答:

很容易想到答案跟牛妹每一张牌是什么没有关系。没一张牌只需要考虑赢、不赢。

赢k分,那就是从n张牌中拿出k张赢,其他输,所以组合数c(n,k).对于赢了答k张,只有一种方法,但是对于剩下的n-k张,都有平局和输掉两种情况,所以是2的n-k次方。两者相乘就是答案。

结果很大对mod=1e9+7取余,用到同余定理。

求2的幂直接暴力求(当然也可以快速幂)

求组合数的时候用到除法,又要取余,所以用到逆元。所以用到逆元公式(当然还有其他求法):pow(x,mod-2)%mod;

但是mod=1e9+7,所以暴力求幂会超时,方法是用快速求幂法压缩时间(快速幂就不贴代码了)

typedef long long ll;

ll fast(ll a,ll n) // 快速幂 pow(a,n)

ll inv(ll x, ll mod)
{

     return fast(x,mod-2);

}

第四题:

有一个射击游戏

有m种颜色的气球,颜色分别为1~m

现在一个人开了n枪,告诉你一个数列,表示打爆的气球颜色分别是多少。(注意,0表示这一枪没有打中,mmp这里害得我debug了好久)

求一个最小区间[l,r],在区间内包含了所有1~m颜色。输出区间长度。

答:

这个题是XUPT  2019寒假训练最后一场比赛的原题的强化版。刚好我做了并且在bilibli上给学弟学妹们讲了,很奈斯。

用一个变量维护当前区间里有多少种颜色,用book数组表示第i种颜色在当前区间内出现了多少次。

然后尺取。

第五题:(没做出来)

有n个积木,高度分别为1~n,除了高度和颜色其他形状都一样。然后想把他们前后排成一排,你站在正前方看(顺序可以随便排)。现在要看到k次颜色(k-1次颜色变化),且前面的积木可以挡住后面的积木,求有多少种方法。

结果对mod=1e9+9取模,对没错,不是1e9+7而是1e9+9。不知道这个是不是质数。

答:不会做,大佬们有会做的请教一下我。

猜你喜欢

转载自blog.csdn.net/GreyBtfly/article/details/88389941