目录
问题A:菱形图案
题目描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的菱形图案。
输入
多组输入,一个整数(2~20)。
输出
针对每行输入,输出用“*”组成的菱形,每个“*”后面有一个空格。每输出一个菱形的后面需要空一行。
样例输入 Copy
2 3 4
样例输出 Copy
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
while True:
try:
n=int(input())
for i in range(n,-1,-1):
for j in range(1,i+1):
print(" ",end="")
for j in range(i,n+1):
print("* ",end="")
print()
for i in range(1,n+1):
for j in range(1,i+1):
print(" ",end="")
for j in range(i,n+1):
print("* ",end="")
print()
print()
except:
break
问题B:1的个数
题目描述
输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。
输入
输入一个整数(int类型)。
输出
这个数转换成2进制后,输出1的个数。
样例输入 Copy
5
样例输出 Copy
2
n=int(input())
print(str(bin(n)).count("1"))
问题C:最小素数对
题目描述
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。
输入
输入一个偶数。
输出
输出两个素数。
样例输入 Copy
20
样例输出 Copy
7 13
n=int(input())
import math
def s(n):
if n==1:
return 0
for i in range(2,int(math.sqrt(n))+1):
if n%i==0:
return 0
return 1
ans=0
for i in range(int(n/2),2,-1):
if s(n-i)==1 and s(i)==1:
print(i)
print(n-i)
break
问题D:安置路灯
题目描述
小Q正在给一条长度为n的道路设计路灯安置方案。
为了让问题更简单,小Q把道路视为n个方格,需要照亮的地方用'.'表示, 不需要照亮的障碍物格子用'X'表示。
小Q现在要在道路上设置一些路灯, 对于安置在pos位置的路灯, 这盏路灯可以照亮pos - 1, pos, pos + 1这三个位置。
小Q希望能安置尽量少的路灯照亮所有'.'区域, 希望你能帮他计算一下最少需要多少盏路灯。
输入
输入的第一行包含一个正整数t(1 <= t <= 1000), 表示测试用例数 接下来每两行一个测试数据, 第一行一个正整数n(1 <= n <= 1000),表示道路的长度。 第二行一个字符串s表示道路的构造,只包含'.'和'X'。
输出
对于每个测试用例, 输出一个正整数表示最少需要多少盏路灯。
样例输入 Copy
2 3 .X. 11 ...XX....XX
样例输出 Copy
1 3
t=int(input())
while t>0:
n=int(input())
s=str(input())
s=list(s)
count,i=0,0
while i<n:
if s[i]=='.':
count+=1
i+=3
else:
i+=1
print(count)
t-=1
问题E:最小生成树(Prim)
题目描述
使用Prim算法求图的最小生成树(MST)
输入
每组数据分为两个部分,第一部分为图的点数n,和边数m,
第二部分为m行,每一行输入三个数字,前两个为两个顶点的编号,第三个为边权重。
输出
最小生成树,输出时按照边的两个端点的升序输出。(先看左端点,再看右端点,端点不换位置)
样例输入 Copy
3 3 0 1 10 0 2 15 1 2 50
样例输出 Copy
0 1 10 0 2 15
def prim():
closeset=[0 for _ in range(n)]
used=[0 for _ in range(n)]
used[0]=1
for i in range(1,n):
j=0
for k in range(n):
if used[k]==0 and lowcost[k]<lowcost[j]:
j=k
res.append([closeset[j],j,lowcost[j]])
used[j]=1
for k in range(n):
if used[k]==0 and g[j][k]<lowcost[k]:
lowcost[k]=g[j][k]
closeset[k]=j
while True:
n,m=map(int,input().split())
g=[[float('inf') for _ in range(n)]for _ in range(n)]
lowcost=[float('inf') for _ in range(n)]
res=[]
for i in range(m):
a,b,c=map(int,input().split())
g[a][b]=c
g[b][a]=c
if a==0:
lowcost[b]=c
prim()
res.sort()
for a,b,c in res:
print(a,b,c)
问题F:单源最短路径问题
题目描述
编程实现Dijkstra算法,求一个有向加权图中,从源点出发到其他各个顶点的最短路径。
输入
第1行第1个值表示顶点个数,第2个值表示边个数;第2行开始为边(两个顶点,边的起点和终点)及权重。
输出
顶点0到每一个顶点的最短路径长度。
样例输入 Copy
5 7 0 1 10 0 3 30 0 4 100 1 2 50 2 4 10 3 2 20 3 4 60
样例输出 Copy
0 10 50 30 60
def dijkstra():
dis=[float('inf')]*n
dis[0]=0
for i in range(n):
tmin=float('inf')
for j in range(n):
if used[j]==0 and dis[j]<tmin:
tmin=dis[j]
k=j
used[k]=1
for j in range(n):
if used[j]==0 and dis[k]+mp[j][k]<dis[j]:
dis[j]=dis[k]+mp[k][j]
print(*dis)
while True:
n,m=map(int,input().split())
mp=[[float('inf') for _ in range(n)]for _ in range(n)]
used=[0]*n
for i in range(m):
a,b,c=map(int,input().split())
mp[a][b]=c
mp[b][a]=c
dijkstra()
问题G:低碳出行
题目描述
为了做一项关于“爱护环境,从小做起”的公益调查,新司机小明决定开老爸的车从家中前往X市第一小学。从小明家到X市第一小学的交通网络图一共有n个顶点(包括起点小明家和终点X市第一小学)和m条无向边。每条边都有一个碳排放量和一个行驶时间(单位:分钟)。
现在需要你编写一个程序帮助小明实现低碳出行,即寻找一条碳排放量最少的路径,一条路径的碳排放量等于该路径上所有边的碳排放量之和。如果存在两条碳排放量相同的路径,则找出总的行驶时间最少的路径,并输出该路径的总碳排放量和总的时间(分钟)。
输入
单组输入。
在每组输入中,第1行包含两个正整数n和m,分别表示顶点数和边数(n<=1000且m<=1000)。其中,第1号顶点为起点(小明家),第n号顶点为终点(X市第一小学)。两个正整数之间用空格隔开。
第2行到第m+1行表示m条边的信息,每一行包含四个正整数。第1个正整数和第2个正整数表示一条边所对应的两个顶点的编号,第3个正整数表示该边对应的碳排放量,第4个正整数表示该边所对应的行驶时间(单位:分钟)。四个正整数两两之间用空格隔开。
输出
对于每组输入,输出碳排放量最少的路径的总碳排放量和总时间(分钟),如果存在两条碳排放量相同的路径,则输出总的行驶时间最少的路径的总碳排放量和总时间。
样例输入 Copy
3 3 1 2 5 5 1 3 8 11 2 3 3 5
样例输出 Copy
8 10
def dijkstra(s: int, t: int):
visited, co, ti = [False] * (n + 1), [0] * (n + 1), [0] * (n + 1)
for i in range(1, n + 1):
co[i], ti[i] = co2[s][i], tim[s][i]
co[s], ti[s], visited[s] = 0, 0, True
for i in range(n - 1):
index, min_co2, min_time = 0, float('inf'), float('inf')
for j in range(1, n + 1):
if not visited[j] and (co[j] < min_co2 or (co[j] == min_co2 and ti[j] < min_time)):
min_co2, min_time, index = co[j], ti[j], j
visited[index] = True
for v in range(1, n + 1):
tmp_co2, tmp_time = co[index] + co2[index][v], ti[index] + tim[index][v]
if not visited[v] and (tmp_co2 < co[v] or (tmp_co2 == co[v] and tmp_time < ti[v])):
co[v], ti[v] = tmp_co2, tmp_time
print(co[t], ti[t])
n, m = map(int, input().split())
co2, tim = [[float('inf')] * (n + 1) for _ in range(n + 1)], [[float('inf')] * (n + 1) for _ in range(n + 1)]
for _ in range(m):
a, b, c, d = map(int, input().split())
co2[a][b] = co2[b][a] = min(c, co2[a][b])
tim[a][b] = tim[b][a] = min(d, tim[a][b])
dijkstra(1, n)