HDU1032——The 3n + 1 problem,HDU1033——Edge,HDU1034——Candy Sharing Game

目录

[HDU1032------The 3n + 1 problem](#HDU1032——The 3n + 1 problem)

题目描述

运行代码

代码思路

HDU1033------Edge

题目描述

运行代码

代码思路

[HDU1034------Candy Sharing Game](#HDU1034——Candy Sharing Game)

题目描述

运行代码

代码思路

HDU1032------The 3n + 1 problem

题目描述

Problem - 1032

运行代码

cpp 复制代码
#include <iostream>
using namespace std;
int main() {
    int i, j, t, k;
    while (cin >> i >> j) {
        int u = i;
        int o = j;
        int max = 0;
        if (i > j) {
            t = i;
            i = j;
            j = t;
        }
        for (k = i; k <= j; k++) {  // 从 i 到 j 寻找最大循环次数
            int p = k;
            int cn = 0;
            while (p != 1) {
                if (p % 2 != 0)
                    p = 3 * p + 1;
                else
                    p = p / 2;
                cn++;  // cn 记录每个数变成 1 所需要的最大循环次数
            }
            if (max < cn)
                max = cn;
        }
        cout << u << " " << o << " " << max + 1 << endl;
    }
    return 0;
}

代码思路

  1. 读取输入 :代码从标准输入读取两个整数ij,这两个整数定义了我们感兴趣的一个范围。

  2. 交换输入 :如果i大于j,则交换它们的位置,确保i总是小于或等于j,这样在后续的循环中我们可以从ij进行迭代。

  3. 初始化变量uo分别存储了最初的ij的值,以便在最后输出时使用;max变量被初始化为0,用于记录在指定范围内所有数的Collatz序列中,序列长度的最大值。

  4. 遍历范围内的每一个数 :从ij,对于范围内的每一个数k,代码将计算其Collatz序列的长度。

  5. 计算Collatz序列长度 :对于每个数k,初始化p等于k,并使用一个循环来生成Collatz序列,直到p变为1。在这个过程中,如果p是奇数,则更新p3 * p + 1;如果是偶数,则更新pp / 2。每次迭代,cn(循环计数)都会增加,用于记录生成序列所需的步数。

  6. 更新最大序列长度 :每次计算完一个数的序列长度后,检查cn是否大于当前已知的最大序列长度max,如果是,则更新maxcn

  7. 输出结果 :在处理完所有数后,输出最初输入的两个数uo,以及最长序列的长度max + 1(因为序列的初始步骤也算一步)。这里加1是因为循环从某个数开始,最终到达1,所以cn记录的是到达1之前的步数,因此最终结果要加1。

  8. 循环继续或结束 :由于while循环的存在,程序会持续读取和处理输入,直到没有更多的输入为止(例如,当标准输入结束时)。

HDU1033------Edge

题目描述

Problem - 1033

运行代码

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
const int L = 0, R = 1, U = 2, D = 3;  // 代表左右上下 4 方向
int dir_A[] = { U, D, R, L };  // 执行 A 右转操作时 4 个方向变为对应的 UDRL 方向
int dir_V[] = { D, U, L, R };  // 执行 V 左转操作时 4 个方向变为对应的 DULR 方向
int dx[] = { -10, 10, 0, 0 };  // 左右上下 4 方向对应的 X 坐标增量
int dy[] = { 0, 0, 10, -10 };  // y 增量

void Edge(const string& com) {
    cout << "300 420 moveto" << endl;
    cout << "310 420 lineto" << endl;
    int x = 310, y = 420;  // 初始的坐标
    int cur_dir = R;  // 初始的方向始终向右

    for (char c : com) {  // 遍历命令
        int new_dir;  // 新的方向
        if (c == 'A') {
            new_dir = dir_A[cur_dir];
            x += dx[new_dir];  // 新方向 X 增量
            y += dy[new_dir];  // 新方向 Y 增量
        }
        else {
            new_dir = dir_V[cur_dir];
            x += dx[new_dir];
            y += dy[new_dir];
        }
        cur_dir = new_dir;  // 更新当前方向
        cout << x << " " << y << " lineto" << endl;
    }
    cout << "stroke" << endl;
   cout << "showpage" << endl;
}

int main() {
    string com;
    while (cin >> com) {
        Edge(com);
    }
    return 0;
}

代码思路

HDU1034------Candy Sharing Game

题目描述

Problem - 1034

运行代码

cpp 复制代码
#include <iostream>
#include <cstdio>
#define N 100

using namespace std;

int main() {
    int s[N], n, i, k, t, p;

    while (scanf_s("%d", &n) == 1 && n) {
        for (i = 0; i < n; i++)
            scanf_s("%d", s + i);

        for (k = 1; ; k++) {
            t = s[n - 1] / 2;  // 首先处理边界条件,存取最后一个人糖果数的一半

            for (i = 0; i < n; i++) {
                p = s[i] / 2;  // 存取当前糖果数的一半用来给右边的同学
                s[i] = s[i] / 2 + t;  // 自己减一半再加上左边同学给的一半
                t = p;  // 给完一个同学换下一个

                if (s[i] % 2 != 0)  // 当前处理完如果为奇数,收老师一个
                    s[i]++;
            }

            t = s[0];
            bool isSame = true;  // 增加一个标志变量来判断是否每个同学糖果数相同

            for (i = 1; i < n; i++) {
                if (s[0] != s[i]) {
                    isSame = false;
                    break;
                }
            }

            if (isSame) {
                break;
            }
        }

        printf("%d %d\n", k, t);  // 输出游戏次数和每个人最终的糖果数
    }

    return 0;
}

代码思路

  1. 读取输入 :代码从标准输入读取一组整数,第一个整数n表示参与游戏的小朋友的数量,接着读取n个整数,表示每个小朋友初始拥有的糖果数。

  2. 初始化游戏状态 :使用一个整型数组s存储每个小朋友的糖果数,数组s的大小由宏N决定,这里假设最多有100个小朋友参与游戏。

  3. 重新分配糖果:代码进入一个无限循环,开始重新分配糖果的过程。每一次循环代表游戏的一轮。

  4. 处理边界条件:在每轮开始时,处理边界条件,即最后一个小朋友糖果数的一半会被保留,用于在这一轮结束时给予第一个小朋友。

  5. 分配糖果的逻辑:对于每一个小朋友,他们将自己的糖果数分成两半,一半留给自身,另一半给予右边的小朋友。如果分配后糖果数为奇数,则额外获得一颗糖果,以确保糖果数为偶数。

  6. 检查游戏是否结束 :每一轮结束后,检查所有小朋友的糖果数是否相同。为此,代码使用了一个布尔变量isSame来标记所有小朋友的糖果数是否一致。如果所有小朋友的糖果数相同,游戏结束,跳出循环。

  7. 输出结果 :一旦游戏结束,输出游戏的轮数k和每个小朋友最终的糖果数t

  8. 循环处理多组数据 :由于使用了while循环读取输入,代码可以连续处理多组数据,直到读取的n为0或输入结束。

相关推荐
哥不想学算法26 分钟前
【C++】字符串字面量拼接
开发语言·c++
海石39 分钟前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石39 分钟前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
Jerry3 小时前
LeetCode 151. 反转字符串中的单词
算法
gugucoding3 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
ChaoZiLL5 小时前
我的数据结构3——链表(link list)
数据结构·链表
a1117765 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜5 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry5 小时前
LeetCode 541. 反转字符串 II
算法
Jerry6 小时前
LeetCode 344. 反转字符串
算法