一些想法
CSDN 界面丑陋,无关内容、垃圾内容还有广告堆叠如山,各种僵尸号、僵尸粉、AI 水文水贴水评论水回答,最近非常想弃掉这个平台,可毕竟这里算是我梦开始的地方。。。
对我而言 CSDN 的优点有:
- 主页管理方便
- 对图片上传的限制小
- 支持 TOC 目录以及侧边栏目录
- 侧边栏有专栏列表
一番思考后,我决定:
- 仅用来上传刷题、比赛、实验等的记录还有读书笔记(主要写给自己看,也欢迎校友们围观~)
- 关闭各种私信、点赞、收藏通知 (
不用看就知道是一堆僵尸号) - 采用浏览器脚本美化界面,屏蔽广告,最近发现的这个效果还不错:CSDN 独家UI排版
- 努力学习前端,设计自己的 CSDN 美化脚本
题单
- Problem A 1353 Digit String
- Problem B 1475 冰墩墩和冰壶
- Problem C 1477 冰墩墩和徽章
- Problem D 1267 Matrix
- Problem E 1478 冰墩墩和玩偶
- Problem F 1449 网格
这个题单的本意是想让大家学习 C 指针的吧,不过Java 中并没有指针的概念哈哈
A 1553 Digit String
模拟,枚举,进制转换
- 将其他进制转换为
10
10
10 进制可以采用秦九韶算法
以 x x x 为基数,第 i i i 位为 a i a_i ai 的整数可以写成:
f ( x ) = a n x n + a n − 1 x n − 1 + a n − 2 x n − 2 . . . + a 2 x 2 + a 1 x + a 0 = ( a n x n − 1 + a n − 1 x n − 2 + a n − 2 x n − 3 + . . . + a 2 x + a 1 ) x + a 0 = ( ( a n x n − 2 + a n − 1 x n − 3 + a n − 2 x n − 4 + . . . + a 2 ) x + a 1 ) x + a 0 . . . = ( ( ( a n x + a n − 1 ) x + a n − 2 ) x + . . . + a 1 ) x + a 0 \begin{aligned} f(x)& = a_nx^n + a_{n-1}x^{n-1} + a_{n-2}x^{n-2}... + a_2x^2 + a_1x + a_0 \\ & = (a_nx^{n-1} + a_{n-1}x^{n-2} + a_{n-2}x^{n-3} + ... + a_2x + a_1)x + a_0 \\ & = ((a_nx^{n-2} + a_{n-1}x^{n-3} + a_{n-2}x^{n-4} + ... + a_2) x + a_1)x + a_0 \\ &\; ...\\ & = (((a_nx + a_{n-1})x + a_{n -2}) x + ... + a_1)x + a_0 \end{aligned} f(x)=anxn+an−1xn−1+an−2xn−2...+a2x2+a1x+a0=(anxn−1+an−1xn−2+an−2xn−3+...+a2x+a1)x+a0=((anxn−2+an−1xn−3+an−2xn−4+...+a2)x+a1)x+a0...=(((anx+an−1)x+an−2)x+...+a1)x+a0
令:
f ( 1 ) = a n x + a n − 1 f ( 2 ) = f ( 1 ) x + a n − 2 . . . f ( n ) = f ( n − 1 ) x + a 0 f(1) = a_nx + a_{n -1} \\ \;\;\; f(2) = f(1)x + a_{n-2} \\ ...\\ \;\;\;\;\;\; f(n) = f(n-1)x+a_0 f(1)=anx+an−1f(2)=f(1)x+an−2...f(n)=f(n−1)x+a0
即可得到最终的递推公式 在 Java 中可以利用Integer.parseInt(String s, int radix)
方法将来将一个进制为radix
的字符串转换为十进制的数字,类似的还有Integet.toString(int i)
可以将十进制值转换为其他进制- 需要注意的是, i i i 进制的每一位最大只能到 i − 1 i - 1 i−1,因此需要先计算出数码串最小的可能的进制,例如对数码串 321 321 321,最小可能的进制是 4 4 4 进制
- 然后从最小可能的进制枚举到最大可能进制即 16 16 16 即可
核心代码
/* char 类型字符转成对应的 int 型数字 */
static int trans_to_digit (char ch) {
if (ch >= '0' && ch <= '9') return ch - '0';
else return ch - 'A' + 10;
}
/* 使用秦九韶算法将数码串转为十进制值 */
static long trans_to_decimal (String num, int base) {
long decimal = trans_to_digit(num.charAt(0));
for (int i = 1; i < num.length(); ++i) {
int cur = trans_to_digit(num.charAt(i));
decimal = decimal * base + cur;
}
return decimal;
}
static int solve () {
char max = '\0';
for (int i = 0; i < num.length(); ++i)
if (num.charAt(i) > max) max = num.charAt(i);
for (int base = trans_to_digit(max) + 1; base <= 16; ++base) {
long tmp = trans_to_decimal(num, base);
if (tmp == n) return base;
if (tmp > n) return 0;
}
return 0;
}
B 1475 冰墩墩和冰壶
模拟,枚举
- 分别记录红方和黄方所有的壶离圆心的距离(
其实是距离的平方,求真正的距离还要求平方根),记录各自的最小距离 - 分别枚举红方和黄方的距离,若有比对方离圆心的最小距离还要小的就将分数加一
- 根据各自的分数输出结果
核心代码
static void solve () {
Y_score = R_score = 0;
for (int i = 0; i < r; ++i) {
if (R_x[i] * R_x[i] + R_y[i] * R_y[i] < Y_min) ++R_score;
}
for (int i = 0; i < y; ++i) {
if (Y_x[i] * Y_x[i] + Y_y[i] * Y_y[i] < R_min) ++Y_score;
}
}
C 1477 冰墩墩和徽章
模拟,枚举
- 枚举记录志愿者没有(想要)而冰墩墩有且数目大于 1 1 1 (对方可以用来交换)的徽章种数
- 枚举记录冰墩墩没有(想要)而志愿者有且数目大于 1 1 1 (对方可以用来交换)的徽章种数
- 其中较小的那个就是最终的结果
核心代码
static int solve () {
A_res = B_res = 0;
for (int i = 1; i <= MAX_SIZE; ++i) {
if (A[i] > 1 && B[i] == 0) ++A_res;
if (A[i] == 0 && B[i] > 1) ++B_res;
}
return Math.min(A_res, B_res);
}
D 1267 Matrix
模拟
- 没有什么技巧,直接根据题意模拟就好啦
核心代码
static void swap(int x1, int y1, int x2, int y2) {
int tmp = matrix[x1][y1];
matrix[x1][y1] = matrix[x2][y2];
matrix[x2][y2] = tmp;
}
static void IN () {
int val = 1;
int max = Math.max(n, m);
matrix = new int[max][max];
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) matrix[i][j] = val++;
}
}
static void TR () {
for (int i = 0; i < n; ++i) {
for (int j = i; j < Math.max(n, m); ++j) swap(i, j, j, i);
}
int tmp = n;
n = m;
m = tmp;
}
static void SR (int x, int y) {
for (int j = 0; j < m; ++j) swap(x - 1, j, y - 1, j);
}
static void SC (int x, int y) {
for (int i = 0; i < n; ++i) swap(i, x - 1, i, y - 1);
}
static void FR () {
for (int i = 0; i < n / 2; ++i) SR(i + 1, n - i);
}
static void FC () {
for (int j = 0; j < m / 2; ++j) SC(j + 1, m - j);
}
E 1478 冰墩墩和玩偶
哈希,递归
- 自顶向下地递归,将当前串处理完成后递归处理前一半和后一半
- 将得到的所有字符串加入到哈希集合中进行去重
C 语言还是老老实实枚举吧🥹
核心代码
static Set<String> set = new HashSet<>();
static void solve (String str) {
if (set.contains(str) == false) set.add(str);
int length = str.length();
if (length == 1) return ;
solve_Jun0804(str.substring(0, length / 2));
solve_Jun0804(str.substring(length / 2));
}
F 1449 网格
模拟
- 只要找出格子的序号与它的边(火柴棍)的编号之间的关系就好啦
核心代码(进制转换就用 Java 自带的方法偷懒了)
static String str;
static List<List<String>> res = new ArrayList<>();
static void solve_Jun0805 () {
res.clear();
for (int i = 0; i < n; ++i) res.add(new ArrayList<>());
for (int i = 0; i < n; ++i) {
for (int j = (2 * m + 1) * i; j < (2 * m + 1) * i + m; ++j) {
res.get(i).add(
Integer.toHexString(
Integer.parseInt(
"" +
str.charAt(j + m) +
str.charAt(j) +
str.charAt(j + m + 1) +
str.charAt(j + 2 * m + 1),
2)).toUpperCase());
}
}
}