牛牛找工作
为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。
输入描述:
每个输入包含一个测试用例。 每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。 接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。 接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。 保证不存在两项工作的报酬相同。
输出描述:
对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。
输入例子1:
3 3 1 100 10 1000 1000000000 1001 9 10 1000000000
输出例子1:
100 1000 1001
思路:TreeMap
被3整除
小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011...。
并且小Q对于能否被3整除这个性质很感兴趣。
小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。
输入描述:
输入包括两个整数l和r(1 <= l <= r <= 1e9), 表示要求解的区间两端。
输出描述:
输出一个整数, 表示区间内能被3整除的数字个数。
输入例子1:
2 5
输出例子1:
3
例子说明1:
12, 123, 1234, 12345... 其中12, 123, 12345能被3整除。
思路:找规律,写出前几个,发现3个一组重复,第一个不能被3整除,后面2个都可以被3整除
数对
牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。
输入描述:
输入包括两个正整数n,k(1 <= n <= 10^5, 0 <= k <= n - 1)。
输出描述:
对于每个测试用例, 输出一个正整数表示可能的数对数量。
输入例子1:
5 2
输出例子1:
7
例子说明1:
满足条件的数对有(2,3),(2,4),(2,5),(3,4),(3,5),(4,5),(5,3)
思路:枚举被除数,如果枚举余数会TLE
n,k=list(map(int,input().strip().split(' ')))
res=0
for i in range(k, n):
for y in range(i+1, n+1):
res+=(n-i)//y+1
print(res)
n,k=list(map(int,input().strip().split(' ')))
res=0
for y in range(k+1, n+1):
res+=(n//y)*(y-k)
if k:
res+=((n%y)-k+1 if n%y>=k else 0)
else:
res+=(n%y)-k
print(res)
矩形重叠
平面内有n个矩形, 第i个矩形的左下角坐标为(x1[i], y1[i]), 右上角坐标为(x2[i], y2[i])。
如果两个或者多个矩形有公共区域则认为它们是相互重叠的(不考虑边界和角落)。
请你计算出平面内重叠矩形数量最多的地方,有多少个矩形相互重叠。
输入描述:
输入包括五行。 第一行包括一个整数n(2 <= n <= 50), 表示矩形的个数。 第二行包括n个整数x1[i](-10^9 <= x1[i] <= 10^9),表示左下角的横坐标。 第三行包括n个整数y1[i](-10^9 <= y1[i] <= 10^9),表示左下角的纵坐标。 第四行包括n个整数x2[i](-10^9 <= x2[i] <= 10^9),表示右上角的横坐标。 第五行包括n个整数y2[i](-10^9 <= y2[i] <= 10^9),表示右上角的纵坐标。
输出描述:
输出一个正整数, 表示最多的地方有多少个矩形相互重叠,如果矩形都不互相重叠,输出1。
输入例子1:
2 0 90 0 90 100 200 100 200
输出例子1:
2
思路:最有可能相交的地方就是边缘,枚举所有的xy边缘(Again,taolu of wangyi)
# max intersections must contains border
n=int(input())
s=''
while not s: s=input().strip()
x1=list(map(int,s.split(' ')))
s=''
while not s: s=input().strip()
y1=list(map(int,s.split(' ')))
s=''
while not s: s=input().strip()
x2=list(map(int,s.split(' ')))
s=''
while not s: s=input().strip()
y2=list(map(int,s.split(' ')))
xs=set(x1+x2)
ys=set(y1+y2)
res=1
for x in xs:
for y in ys:
t=0
for lbx,lby,rux,ruy in zip(x1,y1,x2,y2):
# if lbx<=x<=rux and lby<=y<=ruy: t+=1
if lbx<x<=rux and lby<y<=ruy: t+=1
res=max(res,t)
print(res)
牛牛的背包问题
牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为w。
牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。
牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也算一种放法)。
输入描述:
输入包括两行 第一行为两个正整数n和w(1 <= n <= 30, 1 <= w <= 2 * 10^9),表示零食的数量和背包的容量。 第二行n个正整数v[i](0 <= v[i] <= 10^9),表示每袋零食的体积。
输出描述:
输出一个正整数, 表示牛牛一共有多少种零食放法。
输入例子1:
3 10 1 2 4
输出例子1:
8
例子说明1:
三种零食总体积小于10,于是每种零食有放入和不放入两种情况,一共有2*2*2 = 8种情况。
思路:BFS+memo
n,w=list(map(int,input().strip().split(' ')))
a=list(map(int,input().strip().split(' ')))
a.sort(reverse=True)
memo={}
def dfs(i,s):
if (i,s) in memo: return memo[(i,s)]
if s>w: return 0
if i==n: return 1
res = dfs(i+1,s+a[i])+dfs(i+1,s)
memo[(i,s)]=res
return res
print(dfs(0,0))