XTU OJ (二)指针专题

一些想法

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+an1xn1+an2xn2...+a2x2+a1x+a0=(anxn1+an1xn2+an2xn3+...+a2x+a1)x+a0=((anxn2+an1xn3+an2xn4+...+a2)x+a1)x+a0...=(((anx+an1)x+an2)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+an1f(2)=f(1)x+an2...f(n)=f(n1)x+a0
    即可得到最终的递推公式
  • 在 Java 中可以利用 Integer.parseInt(String s, int radix) 方法将来将一个进制为 radix 的字符串转换为十进制的数字,类似的还有Integet.toString(int i) 可以将十进制值转换为其他进制
  • 需要注意的是, i i i 进制的每一位最大只能到 i − 1 i - 1 i1,因此需要先计算出数码串最小的可能的进制,例如对数码串 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());
        }
    }
}
  • 27
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值