《算法分析与设计》练习14

问题 A: 1的个数

[命题人 : admin]

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

提交问题列表

解决: 1072提交量: 1494统计

题目描述

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

输入

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

输出

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

样例输入 Copy
5
样例输出 Copy
2
def count_ones(num):
    binary_str = bin(num)[2:]  # 将整数转换为二进制字符串
    return binary_str.count('1')  # 统计二进制字符串中1的个数
 
num = int(input(""))
ones_count = count_ones(num)
print(ones_count)

问题 B: 又一道简单题

[命题人 : 外部导入]

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

提交问题列表

解决: 1260提交量: 3621统计

题目描述

输入一个四个数字组成的整数 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
# 生成1000到9999范围内的完全平方数列表
min_value = 1000
max_value = 9999
perfect_squares = [i * i for i in range(32, 100) if min_value <= i * i <= max_value]
 
def count_perfect_squares(n, perfect_squares):
    count = 0
    for square in perfect_squares:
        diff_count = sum(1 for i, j in zip(str(n), str(square)) if i != j)
        if diff_count == 1:
            count += 1
    return count
 
def solve_perfect_squares(T, test_cases):
    results = []
    for i, n in enumerate(test_cases, 1):
        count = count_perfect_squares(n, perfect_squares)
        results.append(f"Case {i}: {count}")
    return results
 
# 主循环
while True:
    T = int(input())
    if T == 0:
        break
    test_cases = [int(input()) for i in range(T)]
    for result in solve_perfect_squares(T, test_cases):
        print(result)

问题 C: 安置路灯

[命题人 : admin]

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

提交问题列表

解决: 745提交量: 1763统计

题目描述

小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
def min_lights_needed(n, road):
    lights = 0
    i = 0
    while i < n:
        # 如果当前位置是障碍物,则跳过
        if road[i] == 'X':
            i += 1
            continue
        else:
            # 如果当前位置是'.',则安置路灯,并跳到下一个需要照亮的位置
            lights += 1
            i += 3  # 跳到下一个需要照亮的位置
    return lights
 
# 读取输入
t = int(input())
for _ in range(t):
    n = int(input())
    road = input().strip()
    result = min_lights_needed(n, road)
    print(result)

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

[命题人 : 201501010119]

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

提交问题列表

解决: 1182提交量: 1980统计

题目描述

编程实现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
import heapq
 
def dijkstra(graph, source):
    n = len(graph)
    distances = [float('inf')] * n
    distances[source] = 0
    visited = [False] * n
    pq = [(0, source)]
 
    while pq:
        dist_u, u = heapq.heappop(pq)
        visited[u] = True
 
        for v, weight in graph[u]:
            if not visited[v] and dist_u + weight < distances[v]:
                distances[v] = dist_u + weight
                heapq.heappush(pq, (distances[v], v))
 
    return distances
 
# 读取输入
vertex_count, edge_count = map(int, input().split())
graph = [[] for _ in range(vertex_count)]
 
for _ in range(edge_count):
    start, end, weight = map(int, input().split())
    graph[start].append((end, weight))
 
# 计算最短路径
source = 0
shortest_paths = dijkstra(graph, source)
 
# 输出结果
for distance in shortest_paths:
    print(distance, end=" ")

问题 E: ABC + DEF = GHI

[命题人 : 201501010119]

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

提交问题列表

解决: 1078提交量: 2828统计

题目描述

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

输入

输出

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

提交

def find_combinations():
    results = []
    for abc in range(123, 988):  # ABC范围为[123, 987]
        for def_ in range(123, 988):  # DEF范围为[123, 987]
            ghi = abc + def_
            if ghi <= 987:
                abc_str = str(abc)
                def_str = str(def_)
                ghi_str = str(ghi)
                if len(set(abc_str + def_str + ghi_str)) == 9 and '0' not in abc_str + def_str + ghi_str:
                    if len(set(abc_str + def_str + ghi_str)) == 9:
                        results.append((abc, def_, ghi))
 
    results.sort(key=lambda x: (x[0], x[1]))  # 按照ABC升序排列,如果ABC相同,则按照DEF升序排列
    for abc, def_, ghi in results:
        print("{}+{}={}".format(abc, def_, ghi))
 
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
#include <stdio.h>
#include <stdbool.h>
 
#define MAX_M 1000
#define MAX_N 1000
 
int m, n;
char str[MAX_M][MAX_N];
bool vst[MAX_M][MAX_N];
int dir[8][2] = {{-1, -1}, {-1, 0}, {-1, 1},
                 {0, -1}, {0, 1},
                 {1, -1}, {1, 0}, {1, 1}};
 
bool check(int x, int y) {
    if (!vst[x][y] && x >= 0 && x < m && y >= 0 && y < n && str[x][y] == '@') {
        return true;
    } else {
        return false;
    }
}
 
void dfs(int x, int y) {
    vst[x][y] = true;
    for (int i = 0; i < 8; ++i) {
        int nx = x + dir[i][0], ny = y + dir[i][1];
        if (nx >= 0 && nx < m && ny >= 0 && ny < n && check(nx, ny)) {
            dfs(nx, ny);
        }
    }
}
 
int main() {
    while (1) {
        if (scanf("%d%d", &m, &n) != 2) break;
        for (int i = 0; i < m; ++i) {
            scanf("%s", str[i]);
        }
        int count = 0;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                vst[i][j] = false;
            }
        }
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (!vst[i][j] && str[i][j] == '@') {
                    dfs(i, j);
                    count++;
                }
            }
        }
        printf("%d\n", count);
    }
    return 0;
}
 
<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>
  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值