一、蓝桥大学的小B同学宿舍
问题描述
输入描述
输入数据有 T 组测试例,在第一行给出测试例个数 T。
每个测试例的第一行是一个整数 N(1<N < 200),表示要搬运行李的人数。接下来 N 行,每行两个正整数s和t,表示一个人,将行李是从房间号码 s移到到房间号码t。
输出描述
每组输入都有一行输出数据,为一整数T,表示完成任务所花费的最小时间。
输入示例
3
4
10 20
30 40
50 60
70 80
2
1 3
2 200
3
10 100
20 80
30 50
输出示例
10
20
30
问题分析
我们要知道一个点如果在i个区间中,那么就代表有i个学生要搬行李经过该点,且任意两个同学不能同时搬。我们现在统计每个点上经过的同学的数量,然后找到数量最多的那个点,输出他的次数即可。
代码示例(看看就好)
T=int(input())
for i in range(T):
ls=[0 for i in range(401)]
n=int(input())
for j in range(n):
s,t=map(int,input().split())
if t<s:
s,t=t,s
for k in range(s,t+1):
ls[k]+=1
print(max(ls)*10)
二、贪心的自助餐
问题描述
输入描述
第一行输入两个整数n,C(0≤n≤10000,0≤C≤10000),其中 n 为菜品数量,C为小B的肚子容量。接下来 n 行每行输入两个数 v[i],w[i]。v[i] 是第 i 个菜品的价值,w[i] 表示第 i 个菜品的重量(0≤v[i],w[i]≤10000)。
输出描述
输出一行数据,表示最大的价值,保留小数点后三位数。
输入示例
20 1000
1 22
2 43
123 214
12 2
123 432
21 223
22 16
77 49
34 78
34 9
43 677
21 34
23 23
12 56
332 56
21 99
123 545
389 33
12 999
23 88
输出示例
1204.114
问题分析
【贪心算法】按单价(value/weight)排个序,然后就挑单价最高的开始吃,要能一个菜全吃完的就直接给他吃完,若这个菜吃不完,就把剩余的胃都吃他,然后break就行了
代码示例
n,c=map(int,input().split())
ls=[]
value=0
for i in range(n):
v,w=map(int,input().split())
av=v/w
ls.append((v,w,av))
ls=sorted(ls,key=lambda x:x[2],reverse=True)
for i in range(n):
if ls[i][1]<=c:
value+=ls[i][0]
c-=ls[i][1]
else:
value+=c*ls[i][2]
break
print("%.3f"%value)