2024年春季学期《算法分析与设计》练习14

问题 A: 1的个数

[命题人 : admin]

时间限制 : 1.000 sec  内存限制 : 128 MB

提交问题列表

解决: 908提交量: 1251统计

题目描述

输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。

输入

 输入一个整数(int类型)。

输出

这个数转换成2进制后,输出1的个数。

样例输入 Copy
5
样例输出 Copy
2
n = int(input())
m = bin(n)
t = m[2:]
p = t.count('1')
print(p)

问题 B: 又一道简单题

[命题人 : 外部导入]

时间限制 : 5.000 sec  内存限制 : 128 MB

提交问题列表

解决: 1099提交量: 3120统计

题目描述

输入一个四个数字组成的整数 n,你的任务是数一数有多少种方法,恰好修改一个数字,把它 变成一个完全平方数(不能把首位修改成 0)。比如 n=7844,有两种方法:3844=622 和 7744=882。 

输入

输入第一行为整数 T (1<=T<=1000),即测试数据的组数,以后每行包含一个整数 n (1000<=n<=9999)。 

输出

对于每组数据,输出恰好修改一个数字,把 n变成完全平方数的方案数

样例输入 Copy
2
7844
9121
样例输出 Copy
Case 1: 2
Case 2: 0
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int a[105];
int main()
{
    for (int i = 32; i < 100; i++)
    {
        a[i] = i * i;
    }
    int T;
    cin >> T;
    for (int k = 1; k <= T; k++)
    {
        int n;
        int num = 0;
        int cnt = 0;
        cin >> n;
        num = cnt = 0;
        for (int i = 32; i < 100; i++)
        {
            int x = a[i];
            int y = n;
            for (int j = 0; j < 4; j++)
            {
                int w = x % 10;
                int z = y % 10;
                if (w != z)cnt++;
                x /= 10;
                y /= 10;
            }
            if (cnt == 1)
                num++;
            cnt = 0;
        }
        cout << "Case " << k << ": " << num << endl;
    }
    return 0;
}

问题 C: 安置路灯

[命题人 : admin]

时间限制 : 1.000 sec  内存限制 : 128 MB

提交问题列表

解决: 596提交量: 1418统计

题目描述

小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())  
  
for p in range(t):
    n = int(input())  
    road = input()  
  
    count = 0 
    i = 0 
  
    while i < n:
        if road[i] == '.':
            count += 1
            i += 3 
        else:
            i += 1
  
    print(count)

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

[命题人 : 201501010119]

时间限制 : 1.000 sec  内存限制 : 128 MB

提交问题列表

解决: 1030提交量: 1704统计

题目描述

编程实现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(G, start):
    start -= 1
    nod = len(G)
    vis = [0] * nod
    dis = {node: G[start][node] for node in range(nod)}
    vis[start] = 1
    last = start
    for i in range(nod - 1):
        min_dis = inf
        for j in range(nod):
            if vis[j] == 0 and dis[j] < min_dis:
                min_dis = dis[j]
                last = j
        vis[last] = 1
        for k in range(nod):
            if G[last][k] < inf and dis[k] > dis[last] + G[last][k]:
                dis[k] = dis[last] + G[last][k]
    return dis.values()
 
 
inf = float('inf')
n, m = map(int, input().split())
G = [[inf] * n for _ in range(n)]
for i in range(n):
    G[i][i] = 0
for i in range(m):
    a, b, d = map(int, input().split())
    G[a][b] = d
print(*Dijkstra(G, 1))

问题 E: ABC + DEF = GHI

[命题人 : 201501010119]

时间限制 : 1.000 sec  内存限制 : 128 MB

提交问题列表

解决: 949提交量: 2357统计

题目描述

用1, 2, 3...9 这九个数字组成一个数学公式,满足:ABC + DEF = GHI,每个数字只能出现一次,编写程序输出所有的组合。

输入

输出

输出所有的 ABC + DEF = GHI,
每行一条数据,格式为ABC+DEF=GHI
输出结果按照ABC升序排列,如果ABC相同,则按照DEF升序排列。

import itertools
  
def find_combinations():
    combinations = []
  
    for perm in itertools.permutations(range(1, 10)):
        a = perm[0]
        b = perm[1]
        c = perm[2]
        d = perm[3]
        e = perm[4]
        f = perm[5]
        g = perm[6]
        h = perm[7]
        i = perm[8]
  
        x1 = a * 100 + b * 10 + c
        x2 = d * 100 + e * 10 + f
        x3 = g * 100 + h * 10 + i
  
        if x1 + x2 == x3:
            combinations.append((x1, x2, x3))
  
    combinations.sort(key=lambda x: (x[0], x[1]))
    for combination in combinations:
        print(f"{combination[0]}+{combination[1]}={combination[2]}")
  
  
find_combinations()

问题 F: 油田问题

[命题人 : 201501010119]
时间限制 : 1.000 sec  内存限制 : 128 MB

提交问题列表
题目描述

输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),即属于同一个八连块。

输入
多组输入
输入行数m,以及列数n。
然后输入*和@
1<=n,m<=100
输出
联通块个数
样例输入 Copy
<span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">5 5
****@
*@@*@
*@**@
@@@*@
@@**@</span></span></span></span></span>
样例输出 Copy
<span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">2</span></span></span></span></span>
import sys
  
sys.setrecursionlimit(int(1e6))
while True:
    m, n = map(int, input().split())
    str = [list(input()) for _ in range(m)]
    vst = [[False] * n for _ in range(m)]
    dir = [[-1, -1], [-1, 0], [-1, 1],
           [0, -1], [0, 1],
           [1, -1], [1, 0], [1, 1]]
      
    def check(x, y):
        if not vst[x][y] and 0 <= x < m and 0 <= y < n and str[x][y] == '@':
            return True
        else:
            return False
      
    def dfs(x, y):
        vst[x][y] = True
        for i in range(8):
            nx, ny = x + dir[i][0], y + dir[i][1]
            if 0 <= nx < m and 0 <= ny < n and check(nx, ny):
                dfs(nx, ny)
      
    count = 0
    for i in range(m):
        for j in range(n):
            if not vst[i][j] and str[i][j] == '@':
                dfs(i, j)
                count += 1
      
    print(count)

问题 G: 迷宫问题(回溯法求解)

[命题人 : 201701080148]

时间限制 : 1.000 sec  内存限制 : 128 MB

提交问题列表

解决: 76提交量: 129统计

题目描述

输入一个n×n的迷宫,定义左上角为起点,右下角为终点,寻找一条从起点到终点的路径

输入

多组输入
每组输入第一行有两个整数n,m表示迷宫尺寸
后跟n行,每行m个字符0表示道路,1表示墙壁
1<=n,m<=10

输出

输出地图,用2表示路径
多个答案输出任意一种即可

样例输入 Copy
5 5
0 1 1 1 1
0 0 0 0 1
1 1 1 0 1
0 0 0 0 1
0 1 1 0 0
样例输出 Copy
2 1 1 1 1
2 2 2 2 1
1 1 1 2 1
0 0 0 2 1
0 1 1 2 2
deals = [lambda x, y: (x + 1, y),  # 向下
         lambda x, y: (x, y + 1),  # 向右
         lambda x, y: (x - 1, y),  # 向上
         lambda x, y: (x, y - 1),  # 向左
         ]
 
 
def deal_maze(start, end, maze):
    global ans
    flag = False
    path = []
    path.append(start)
    maze[0][0] = 2
    while len(path) > 0:
        curnode = path[-1]
        if curnode[0] == end[0] and curnode[1] == end[1]:
            flag = True
            for i in path:
                ans.append(i)
            return True
        for deal in deals:
            nextnode = deal(curnode[0], curnode[1])
            if 0 <= nextnode[0] <= end[0] and 0 <= nextnode[1] <= end[1]:
                if maze[nextnode[0]][nextnode[1]] == 0:
                    path.append(nextnode)
                    maze[nextnode[0]][nextnode[1]] = 2
                    break
        else:
            path.pop()
    else:
        return False
 
 
while True:
    ans = []
    [a, b] = list(map(int, input().split()))
    maze = []
    for i in range(a):
        maze.append([int(j) for j in input().split()])
 
    deal_maze((0, 0), (a - 1, b - 1), maze)
    for i in range(len(ans)):
        maze[ans[i][0]][ans[i][1]] = 2
    for i in range(a):
        print(*maze[i])

问题 H: 低碳出行

[命题人 : admin]

时间限制 : 1.000 sec  内存限制 : 128 MB

提交问题列表

解决: 49提交量: 196统计

题目描述

为了做一项关于“爱护环境,从小做起”的公益调查,新司机小明决定开老爸的车从家中前往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

import math
 
while True:
 
    n, m = map(int, input().split())
    maze = [[math.inf] * n for _ in range(n)]
    for i in range(n):
        maze[i][i] = 0
    exp = [[0] * n for _ in range(n)]
    for i in range(m):
        x, y, e, d = map(int, input().split())
        maze[x - 1][y - 1] = d
        maze[y - 1][x - 1] = d
        exp[x - 1][y - 1] = e
        exp[y - 1][x - 1] = e
    for i in range(n):
        for j in range(n):
            for k in range(n):
                if maze[i][j] > maze[i][k] + maze[k][j]:
                    exp[i][j] = exp[i][k] + exp[k][j]
                    maze[i][j] = maze[i][k] + maze[k][j]
    print(exp[0][-1], maze[0][-1])
import math

while True:
    n, m = map(int, input().split())
    cc, tim = [[math.inf] * (n + 1) for _ in range(n + 1)], [[math.inf] * (n + 1) for _ in range(n + 1)]
    for _ in range(m):
        a, b, c, d = map(int, input().split())
        cc[a][b] = cc[b][a] = min(c, cc[a][b])
        tim[a][b] = tim[b][a] = min(d, tim[a][b])
    s, t = 1, n
    vis, co, ti = [0] * (n + 1), [0] * (n + 1), [0] * (n + 1)
    for i in range(1, n + 1):
        co[i], ti[i] = cc[s][i], tim[s][i]
    co[s], ti[s], vis[s] = 0, 0, 1
    for i in range(n - 1):
        ind, min_cc, min_time = 0, math.inf, math.inf
        for j in range(1, n + 1):
            if not vis[j] and (co[j] < min_cc or (co[j] == min_cc and ti[j] < min_time)):
                min_cc, min_time, ind = co[j], ti[j], j
        vis[ind] = 1
        for v in range(1, n + 1):
            tmp_cc, tmp_time = co[ind] + cc[ind][v], ti[ind] + tim[ind][v]
            if not vis[v] and (tmp_cc < co[v] or (tmp_cc == co[v] and tmp_time < ti[v])):
                co[v], ti[v] = tmp_cc, tmp_time
    print(co[t], ti[t])

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值