腾讯暑期实习常规批笔试,数据分析岗
1,游戏
问题:开始前可以用金币购买血量,然后可以选择挑战几个怪物,求最大金币收益。
给定怪物个数n,和每个金币可以购买的血量m
然后是n行,每行代表怪物需要消耗的血量和奖励的金币
解法:循环
n,m = map(int, input().split()) tem=m #剩余的血量 cost=1 #开局使用的金币数 gain=0 #获得的金币 res=[] for i in range(n): c,g = map(int, input().split()) while tem<c: tem+=m cost+=1 tem-=c gain+=g res.append(gain-cost) print(max(res)2,积分
问题:两个线段分别为y2=2Ax;y=Bx+C。
对y积分求面积
输入ABC;求两者围起来的面积
解法:对y积分
两式联力,求交点的y坐标(根据求根公式判断有无焦点)对y积分求面积
# -*- coding: utf-8 -*- def func(A, B, C): delta = A**2-2*A*B*C if delta <= 0: return 0 y1 = (A + delta ** 0.5) / B y2 = (A - delta ** 0.5) / B if y1 > y2: y1, y2 = y2, y1 s1=-y1**3/6/A+y1**2/2/B-C*y1/B s2=-y2**3/6/A+y2**2/2/B-C*y2/B return s2-s1 while True: try: n = int(input()) for i in range(n): A, B, C = map(int, input().split()) print(func(A, B, C)) except: break3,
问题:n个房间,每个房间可以报1,2,3,……m的数字,求存在两个相邻房间报数相同的情形总数%100003
解法:
(1)概率论:所有情形数-相反事件的情形数,其中相反事件为任意相邻房间报数不同
直接使用该式30%
(2)快速幂:x**0=1,如果幂是奇数,则等于x乘以x**(n-1);如果幂是偶数则等于x**(n/2)**2
需要在每一步均取余数
def fastExpMod(b, e, mod): #快速幂函数 if e==0: return 1 if e%2==1: return fastExpMod(b,e-1,m)*b%mod else: return fastExpMod(b,e/2,m)**2%mod mod = 100003 m, n = map(int, input().split()) x1 = fastExpMod(m,n,mod) x2 = m*fastExpMod(m-1,n-1,mod) print((x1-x2)%mod)4,
问题:
n行,k列
如果两行的和每个元素相等,则为一对。求总对数
例如第一行为1,2,3,第二行为4,3,2。
例如第一行为1,2,3,第二行为4,3,2。
解法:
找出变化值相反的,使用变化值作为字典的键
from collections import defaultdict n, k = map(int, input().split()) nums = [] dic = defaultdict(int) for i in range(n): x = list(map(int, input().split())) tmp = [] for j in range(k-1): tmp.append(x[j+1]-x[j]) dic[tuple(tmp)] += 1 res=0 for key,val in dic.items(): inv=tuple([-i for i in key]) if inv==key: #需要考虑变化值为0的情况 res+=val*(val-1) else: res+=val*dic[inv] print(res/2)5,LeetCode 547 朋友圈
共有n个关系,每个关系包括两个点。所有有关系的点都在同一个圈里,求最大的圈含有点的个数
from collections import defaultdict T = int(input()) for i in range(T): graph = defaultdict(list) sts = set() n = int(input()) for j in range(n): a, b = map(int, input().split()) graph[a].append(b) graph[b].append(a) sts.add(a) sts.add(b) res = 1 vis = set() #vis:全局浏览记录 for i in sts: if i in vis:continue q = [i] #q:队列,广度优先搜索 vis1=set() #vis1:该圈浏览记录 while q: x = q.pop(0) vis.add(x) vis1.add(x) for y in graph[x]: if not y in vis1: q.append(y) res = max(res, len(vis1)) print(res)