HNUCM-2023年春季学期《算法分析与设计》练习13

目录

问题A:菱形图案

问题B:1的个数

问题C:最小素数对

问题D:安置路灯

问题E:最小生成树(Prim)

问题F:单源最短路径问题

问题G:低碳出行


问题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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值