IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Vj程序设计作业H3 -> 正文阅读

[数据结构与算法]Vj程序设计作业H3

A?:?游戏

问题描述

  有 n 个小朋友围成一圈玩游戏,小朋友从 1 至 n 编号,2 号小朋友坐在 1 号小朋友的顺时针方向,3 号小朋友坐在 2 号小朋友的顺时针方向,……,1 号小朋友坐在 n 号小朋友的顺时针方向。
  游戏开始,从 1 号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加 1。若一个小朋友报的数为 k 的倍数或其末位数(即数的个位)为 k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小朋友时,该小朋友获胜。
  例如,当 n=5, k=2 时:
  1 号小朋友报数 1;
  2 号小朋友报数 2 淘汰;
  3 号小朋友报数 3;
  4 号小朋友报数 4 淘汰;
  5 号小朋友报数 5;
  1 号小朋友报数 6 淘汰;
  3 号小朋友报数 7;
  5 号小朋友报数 8 淘汰;
  3 号小朋友获胜。

  给定 n 和 k,请问最后获胜的小朋友编号为多少?

输入格式

输入一行,包括两个整数 n 和 k,意义如题目所述。

输出格式

输出一行,包含一个整数,表示获胜的小朋友编号。

样例 1

输入

5 2

输出

3

样例 2

输入

7 3

输出

4

数据规模和约定

对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。

解答

#include <iostream>

using namespace std;

int main()
{
    int n, k;
    cin >> n >> k;
    int a[n + 1];
    int O = 0;
    for (int i = 0; i <= n; i++)
    {
        a[i] = 1;
    }
    int x = 1;
    int y = 1;
    while (O < n - 1)
    {
        if (x > n)
        {
            x = x - n;
        }
        if (a[x] != 0)
        {
            a[x] = y;
            int d = y % 10;

            if (y % k == 0 || d == k)
            {
                a[x] = 0;
                O++;
            }
            x++;
            y++;
        }
        else
        {
            x++;
        }
    }
    for (int i = 1; i < n + 1; i++)
    {
        if (a[i] != 0)
        {
            cout << i << endl;
        }
    }
    return 0;
}

B?:?跳一跳

问题描述

 近来,跳一跳这款小游戏风靡全国,受到不少玩家的喜爱。
  简化后的跳一跳规则如下:玩家每次从当前方块跳到下一个方块,如果没有跳到下一个方块上则游戏结束。
  如果跳到了方块上,但没有跳到方块的中心则获得 1 分;跳到方块中心时,若上一次的得分为 1 分或这是本局游戏的第一次跳跃则此次得分为 2 分,否则此次得分比上一次得分多两分(即连续跳到方块中心时,总得分将 +2,+4,+6,+8...)。
  现在给出一个人跳一跳的全过程,请你求出他本局游戏的得分(按照题目描述的规则)。

输入格式

输入包含多个数字,用空格分隔,每个数字都是 1,2,0 之一,1 表示此次跳跃跳到了方块上但是没有跳到中心,2 表示此次跳跃跳到了方块上并且跳到了方块中心,0 表示此次跳跃没有跳到方块上(此时游戏结束)。

输出格式

输出一个整数,为本局游戏的得分(在本题的规则下)。

样例输入

1 1 2 2 2 1 1 2 2 0

样例输出

22

数据规模和约定

对于所有评测用例,输入的数字不超过 30 个,保证 0 正好出现一次且为最后一个数字。

解答

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    int sum = 0;   // 记录得分
    int x = 0;     // 记录上一次跳跃的得分
    int y = 1;     // 跳跃的次数,进行判断是否第一次就跳到了中心
    while (n != 0) // 判断游戏是否结束
    {
        if (n == 1) // 没有跳到中心
        {
            x = 1;
            sum = sum + x;
            // x = 1;
        }
        else
        {
            if (y == 1 || x == 1) // 跳到中心
            {
                x = 2;
                sum = sum + x;
            }
            else
            {
                x = x + 2;
                sum = sum + x;
            }
        }
        cin >> n;
        y++;
    }
    cout << sum << endl;
    return 0;
}

C?:?奇怪的电梯

问题描述

小 H 有一个奇怪的电梯,电梯可以根据需要停在每个楼层,每个楼层上都对应一个数字Ki?(0 <=?Ki??<= N),该电梯只有两个按钮:"UP"和"DOWN"。在第 i 层楼,如果按下"UP"按钮,电梯将移动到i+Ki?层;如果按下"DOWN",电梯将移动到i?Ki?层。当然,电梯有一个移动的范围,不能高于 N 且不能低于 1。例如,有一个 5 层楼的建筑物,k1?=3,k2?=3,k3?=1,k4?=2,k5?=5。从一楼开始,按"UP"按钮,将上升到四楼,如果按"DOWN"按钮,电梯将无法移动,因为它不能下降到-2 楼。
现在问题来了:小 H 想从 A 层移动到 B 层,他至少要按几次"UP"或"DOWN"按钮,你能帮帮他嘛?

输入格式

输入包含多个测试用例。每个测试用例包含两行。
第一行包含上述三个整数 N,A,B(1 <= N,A,B <= 200),第二行包含 N 个整数k1?,k2?,....kn?。
若读取到单个 0,则表示输入结束

输出格式

对于每个测试用例,输出一个整数表示最少按下"UP"或"DOWN"按钮的次数,若无法到达 B 层,请输出"-1"。每个测试用例的输出占一行。

样例输入

5 1 5
3 3 1 2 5
0

样例输出

3

数据规模和约定

1<=N,A,B<=200,0<=ki?<=N

提示

隐式图问题

解答

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int sum = 0;   // 记录案例个数
    vector<int> g; // 记录案例个数的数组
    int n;
    while (cin >> n && n)
    {
        int A, B;
        cin >> A >> B;
        vector<pair<int, int>> a(n + 1); // first 是楼层,second是标记
        int c[n + 1];                    // 记录步数
        for (int i = 0; i <= n; i++)
        {
            // a[i] = 0;
            c[i] = 0;
        }
        for (int i = 0; i <= n; i++)
        {
            a[i].first = i;
            a[i].second = 0;
        }
        int b[n + 1]; // 每层楼梯可以上升或下降的高度
        for (int i = 1; i <= n; i++)
        {
            cin >> b[i];
        }
        queue<pair<int, int>> q;
        q.push(a[A]);
        a[A].second++;
        pair<int, int> x;
        while (!q.empty())
        {
            x = q.front();
            q.pop();
            int x1, x2;
            x1 = x.first - b[x.first]; // 下降的楼层数
            x2 = x.first + b[x.first]; // 上升的楼层数
            // 进行判断楼层是否被标记,未被标记就加入到队列中
            if (x1 >= 1 && a[x1].second == 0)
            {
                q.push(a[x1]);
                a[x1].second++;
                c[x1] = c[x.first] + 1;
            }
            if (x2 <= n && a[x2].second == 0)
            {
                q.push(a[x2]);
                a[x2].second++;
                c[x2] = c[x.first] + 1;
            }
            // 判断是否到达需要到达的楼层
            if (x.first == a[B].first)
            {
                int u = c[B];
                g.push_back(u);
                sum++;
                break;
            }
        }
        // 判断是否无法到达需要到达的楼层
        if (x.first != a[B].first)
        {
            g.push_back(-1);
            sum++;
        }
        // cout << c[B] << endl;
    }
    // 输出结果
    for (int i = 0; i < sum; i++)
    {
        cout << g[i] << endl;
    }
    return 0;
}

D?:?选数

问题描述

已知 n 个整数?x1?,x2?,…,xn??和 1 个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当n=4,k=3,x1?=3,x2?=7,x3?=12,x4?=19时,可得全部的组合与它们的和为:

3+7+12=22?3+7+19=29?7+12+19=38
3+12+19=34

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=29。

输入格式

输入包含两行
第一行两个数 n,k
第二行 n 个数依次表示xi?

输出格式

一个整数,表示合法的组合数

样例输入

4 3
3 7 12 19

样例输出

1

数据规模和约定

1<=k<n<=20
1<=xi?<=5000000

提示

素数的判定方法

bool prime(int n)
{
        if(n==1) return false;
        if (n==2) return true;
	for(int i=2;i*i<=n;i++)
	   if (n%i==0) return false;
	return true; 
}

解答

#include <bits/stdc++.h>

using namespace std;
int cnt = 0;
int k;
int n;
vector<int> a;
bool prime(int n)
{
    if (n == 1)
        return false;
    if (n == 2)
        return true;
    for (int i = 2; i * i <= n; i++)
        if (n % i == 0)
            return false;
    return true;
}

void dfs(int sum, int kk, int x)
{
    if (kk == (k + 1) && prime(sum))
    {
        cnt++;
        return;
    }
    if (x >= n || kk >= k + 1)
    {
        return;
    }
    dfs(sum, kk, x + 1);
    dfs(sum + a[x], kk + 1, x + 1);
}
int main()
{
    // int n, k;
    cin >> n >> k;
    // int a[n];
    for (int i = 0; i < n; i++)
    {
        int d;
        cin >> d;
        a.push_back(d);
    }
    dfs(0, 1, 0);
    cout << cnt << endl;
    return 0;
}

E?:?棋盘问题

问题描述

小 H 收集到一些形状特殊的棋盘,她想在棋盘上面摆放棋子(棋子都是相同的)。她希望摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,你能帮她求解对于给定形状和大小的棋盘,摆放 k 个棋子的所有可行的摆放方案数 C 嘛?

输入格式

输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个 n*n 的矩阵内描述棋盘,以及摆放棋子的数目。
当为-1 -1 时表示输入结束。
随后的 n 行描述了棋盘的形状:每行有 n 个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
注意只有#棋盘区域可以摆放棋子。

输出格式

对于每一组数据,给出一行输出,输出摆放的方案数目 C (数据保证 C<2^31)

样例输入

2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1

样例输出

2
1

数据规模和约定

1<=k<=n<=8

?解答

#include <bits/stdc++.h>

using namespace std;
char a[10][10];
int n;
int k;
int cnt = 0;
int b[10];
void dfs(int kk, int x)
{

    if (kk > k)
    {
        cnt++;
        return;
    }
    if (x > n)
    {
        return;
    }
    for (int i = 1; i <= n; i++)
    {
        if (!b[i] && a[x][i] == '#')
        {
            b[i] = 1;
            dfs(kk + 1, x + 1);
            b[i] = 0;
        }
    }

    dfs(kk, x + 1);
}

int main()
{
    while (cin >> n >> k)
    {
        if (n == -1 && k == -1)
        {
            break;
        }
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                cin >> a[i][j];
            }
        }
        for (int i = 0; i < 10; i++)
        {
            b[i] = 0;
        }
        dfs(1, 1);
        cout << cnt << endl;
        cnt = 0;
    }

    return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 11:03:35  更:2022-07-03 11:07:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:31:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码