目录
问题 A: 最少硬币
题目描述
假设有4种硬币,它们的面值分别为1分、5分、10分和25分。
现在要找给顾客n分钱。
请问怎样找零钱才能使给顾客的硬币个数最少?
输出所需最少硬币的枚数。
输入
输入需要找给顾客的零钱n(单位:分)。
输出
输出所需最少硬币的枚数。
样例输入 Copy
8 10 63
样例输出 Copy
4 1 6
思路:动态规划和贪心求解
def min_num(money):
num = 0
for i in [25,10, 5, 1]:
num += int(money/i)
money = money%i
return num
while True:
n=int(input())
print(min_num(n))
m=[1,5,10,25]
while True:
try:
n=int(input())
dp=[0]*(n+1)
for i in range(4):
for j in range(m[i],n+1):
if dp[j]!=0:
dp[j]=min(dp[j-m[i]]+1,dp[j])
else:
dp[j]=dp[j-m[i]]+1
print(dp[n])
except:
break
问题 B: X星纸币
题目描述
X星最新版纸币的面额很奇怪,一共有1元、4元、9元、16元、25元、100元六种不同的面额。
已知每种面额纸币的数量不限,现在需要从中选取若干张纸币组成N元(N为正整数)。
请编写一个程序计算组成N元最少需要的纸币数量。
输入
单组输入。
每组1行,包含一个正整数N,N<=10^6。
输出
输出组成N元最少需要的纸币数量。
样例输入 Copy
12
样例输出 Copy
3
提示
组成12元最少需要3张面值都是4的纸币。
思路:只能dp求解,题A基础上改个数组就行
m=[1,4,9,16,25,100]
while True:
try:
n=int(input())
dp=[0]*(n+1)
for i in range(6):
for j in range(m[i],n+1):
if dp[j]!=0:
dp[j]=min(dp[j-m[i]]+1,dp[j])
else:
dp[j]=dp[j-m[i]]+1
print(dp[n])
except:
break
问题 C: 图书排序
题目描述
某图书销售管理系统需要对图书(Book)进行排序,每一本图书包含书名(bookName)、销量(bookSales)、价格(bookPrice)等属性,要求先按照销量由大到小排序,对于销量相同的图书再按照价格由小到大排序。
输入
每组输入包括两个部分,第一部分为书的数量n,
接下来n行则为n本书的信息。 按顺序输入书名(不超过20个字)、销量、价格。
输出
输出排序后的信息,每个属性用空格隔开
样例输入 Copy
7 C++程序设计 120 25.00 软件工程 96 48.00 高等数学 80 32.50 算法分析与设计 96 54.00 离散数学 96 28.00 计算机网络 96 36.00 操作系统 115 45.00
样例输出 Copy
C++程序设计 120 25.00 操作系统 115 45.00 离散数学 96 28.00 计算机网络 96 36.00 软件工程 96 48.00 算法分析与设计 96 54.00 高等数学 80 32.50
思路:简单的排序问题 sort加lambda函数
n=int(input())
book=[]
for i in range(n):
bookname,booksales,bookprice=input().split()
book.append((bookname,booksales,bookprice))
book.sort(key=lambda x:(-int(x[1]),float(x[2])))
for i in range(n):
print(book[i][0],book[i][1],book[i][2])
问题 D: 月饼
题目描述
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。
输入
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。随后一行给出N个正实数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正实数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
输出
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。(四舍五入)
样例输入 Copy
3 20 18 15 10 75 72 45
样例输出 Copy
94.50
思路:部分01背包问题,贪心算法求解
while True:
try:
n, d = map(int, input().split())
cake, cnt, res = [], 0, 0.0
for i in input().split():
cake.append([float(i), 0])
for i in input().split():
cake[cnt][1], cnt = float(i), cnt + 1
cake.sort(reverse=True, key=lambda x: x[1] / x[0])
cnt = 0
while d > 0:
w=cake[cnt][0]
v=cake[cnt][1]
cnt = cnt + 1
if d >= w:
res= res + v
d=d-w
else:
res= res + d / w * v
d=0
print("%.2f" % res)
except:
break
问题 E: 汽车加油问题
题目描述
一辆汽车加满油后可以行驶n千米。旅途中有k个加油站。若要使沿途的加油次数最少,请设计一个有效的算法。
输入
第一行有2个正整数n和k,表示汽车加满油后可行驶nkm,且旅途中有k个加油站。接下来1行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油,且在第0个加油站满油不算加油,第k+1个加油站表示目的地。(请处理到文件尾)
输出
最少加油次数。如果无法到达目的地,则输出“No Solution”。
样例输入 Copy
7 7 1 2 3 4 5 1 6 6
样例输出 Copy
4
思路:到达不了的那个加油站的前面一个加油站加油即可,
def g(n, a):
s, num = 0, 0
for i in a:
if i > n:
print("No Solution")
return
s += i
if s > n:
s = i
num += 1
print(num)
return
while True:
n, k = map(int, input().split())
d = list(map(int, input().split()))
g(n, d)
问题 F: 今年暑假不AC
题目描述
“今年暑假不AC?”
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%...”
确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。
作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)
输入
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
输出
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
样例输入 Copy
12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 0
样例输出 Copy
5
思路:活动安排问题,以结束时间排序
while True:
try:
n=int(input())
if n==0:
break
b=[]
for i in range(n):
s,f=input().split()
b.append([s,f])
b.sort(key=lambda x:int(x[1]))
ans=0
res=0
for t in b:
if int(t[0])>=res:
ans+=1
res=int(t[1])
print(ans)
except:
break
问题 G: 组个最小数
题目描述
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如: 给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。 现给定数字,请编写程序输出能够组成的最小的数。
输入
每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。 10个数字的总个数不超过200,且至少拥有1个非0的数字。
输出
在一行中输出能够组成的最小的数。
样例输入 Copy
2 2 0 0 0 3 0 0 1 0
样例输出 Copy
10015558
思路:简单的打印数字问题,先找到第一个数,然后从0-10开始打印
while True:
a=list(map(int,input().split()))
num={i:a[i] for i in range(10)}
for i in range(1,10):
if num[i]!=0:
print(i,end='')
num[i]-=1
break
for i in range(10):
if num[i]!=0:
for _ in range(num[i]):
print(i,end='')