蓝桥杯A组——Python(09.29)Day3
试题E:回路计数:
某学校由21栋教学楼组成,教学楼编号1到21。对于两栋教学楼a和b,当a和b互质时,a和6之间有一条走廊直接相连,否则没有直接连接的走廊。
小蓝现在在第一栋教学楼,他想要访问每栋教学楼正好一次,最终回到第一栋教学楼,请问他有多少种不同的访问方案?
#哈密尔顿回路题
有点难,用了二进制移位,遍历二维数组,有1<<21(即2**21)太大了,Python要跑好久肯定超时了。
import math
n, m = 21, 1 << 21 #m是二进制移位,相当于2**21
dp = [[0] * n for _ in range((m))]
v = [[0] * n for _ in range(n)]
res = 0
for i in range(1, 22):
for j in range(1, 22):
if math.gcd(i, j) == 1: #互质判断
v[i - 1][j - 1] = v[j - 1][i - 1] = 1
dp[1][0] = 1
for i in range(1, 1 << 21):
for j in range(21):
if ((i >> j) & 1): #位与运算判断二进制i的j是不是1
for k in range(21):
if (i >> k) & 1 or (not v[j][k]):
continue
dp[i + (1 << k)][k] += dp[i][j]
for i in range(21):
res += dp[(1 << 21) - 1][i]
print(res)
略难,pytho时间太久了,下面用c写了一个
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 21
#define M (1 << 21)
int gcd(int a, int b) {
while (b != 0) {
int t = b;
b = a % b;
a = t;
}
return a;
}
int main() {
int dp[M][N] = {0};
int v[N][N] = {0};
int res = 0;
// 初始化v数组
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (gcd(i, j) == 1) {
v[i - 1][j - 1] = 1;
v[j - 1][i - 1] = 1;
}
}
}
// 初始化dp数组
dp[1][0] = 1;
// 动态规划计算
for (int i = 1; i < M; i++) {
for (int j = 0; j < N; j++) {
if ((i >> j) & 1) {
for (int k = 0; k < N; k++) {
if ((i >> k) & 1 || !v[j][k]) continue;
dp[i | (1 << k)][k] += dp[i][j];
}
}
}
}
// 计算最终结果
for (int i = 0; i < N; i++) {
res += dp[M - 1][i];
}
printf("%d\n", res);
return 0;
}
没超时,但c还是太恶心了
~~
试题F:时间显示:
显示时间。不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。
输入为一个int,表示毫秒,给定的时间为不超过10**18的正整数。
#前一个小难给我恶心坏了,这个简单一点
简单题熟悉一下格式化输出和整除取余运算
time = int(input('please input times(ms)'))//1000
#ms转换为s,多余的直接舍去
ss = time%60
time//=60
mm = time%60
time//=60
hh = time%24
print("%02d:%02d:%02d"%(hh,mm,ss))
——————————————————————————————————
有难有简单,劳逸结合
Day3终——进步ing