问题 A: 1的个数
[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB
提交问题列表
题目描述
输入一个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
提交问题列表
题目描述
输入一个四个数字组成的整数 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
提交问题列表
题目描述
小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
提交问题列表
题目描述
编程实现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
提交问题列表
题目描述
用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()
题目描述
输入一个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>