前言
这是第四届大学生算法挑战赛的练习赛系列,这个比赛是国家一级协会的。
这章是进阶训练1的A-E题,感觉还是蛮基础的。
题解
第四届大学生算法挑战赛 进阶训练1
A. 小理养鱼
思路: 博弈 + 斐波那契数组
省流描述: 经典的羊狼博弈,即1只羊,N只狼,狼吃羊会变羊,求狼是否能吃羊。
可以发现当
- n为奇数时,可以吃
- n为偶数时,不可以吃
而繁衍相关,打表可以发现呈现经典的排列
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
这不就是斐波那契数列吗?
其分布,呈现 2奇数+1偶数周期出现
这题需要注意有多行输入,遇到EOF为止
# coding=utf-8
import math
def solve():
n = int(input())
r = n // 3 * 2 + (n % 3)
print (r)
try:
while True:
solve()
except Exception:
pass
不过赛氪OJ卡python,所以这题得用c++才行
#include <iostream>
using namespace std;
void solve(int64_t n) {
int64_t r = (n / 3) * 2 + (n % 3);
cout << r << endl;
}
int main() {
int64_t v;
while (cin >> v) {
solve(v);
}
return 0;
}
B. 约瑟夫环
思路: 暴力
数据规模较小,直接模拟即可
n, k, m = list(map(int, input().split()))
arr = list(range(n))
while len(arr) > 1:
k = (k + m - 1) % len(arr)
del arr[k]
print (arr[0])
C. 行列互换
技巧: python的zip操作
题意: 把3x3的矩阵置换
g = []
for _ in range(3):
g.append(list(map(int, input().split())))
for r in zip(*g):
print(*r, sep=' ')
D. 字符金字塔
思路: 构造+模拟
题意:构造指定大小的金字塔
c = input()
h = ord(c[0]) - ord('A') + 1
for i in range(h):
s = [' '] * (i + h)
for j in range(i+1):
s[h - 1 - j] = s[h - 1 + j] = chr(ord('A') + i - j)
print (''.join(s))
代码的思路是确立中轴线,然后中心扩展
E. 小理的数列
思路: 打表找规律
打印 0~10
# 三列分别为n, n的二进制表达式, f(n)
0 0 0
1 1 1
2 10 1
3 11 2
4 100 1
5 101 2
6 110 2
7 111 3
8 1000 1
9 1001 2
10 1010 2
可以发现 f ( n ) = b i t _ c o u n t ( n ) f(n) = bit\_count(n) f(n)=bit_count(n), 也就是值n的二进制表达式中1的个数
那 f ( n ) = f ( m ) = x f(n)=f(m)=x f(n)=f(m)=x,
m 最小为 ( 1 < < m ) − 1 m最小为(1 << m) - 1 m最小为(1<<m)−1
t = int(input())
for _ in range(t):
v = int(input())
n1 = bin(v)[2:].count('1')
print (n1, (1 << n1) - 1)
写在最后
A-E题感觉非常的基础,顺带考察思维