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;
}
Vj程序设计作业H3相关推荐
- Vj程序设计作业H2
A : 相邻数对 问题描述 给定 n 个不同的整数,问这些数中有多少对整数,它们的值正好相差 1. 输入格式 输入的第一行包含一个整数 n,表示给定整数的个数. 第二行包含所给定的 n 个整数. 输出 ...
- Vj程序设计作业H11
A : 爬台阶 题目描述 楼上有 n 级台阶,其中有 m 级台阶是不安全的.yhf 一开始站在第 0 级台阶上,希望最终走到第 n 级台阶 yhf 跨一步满足以下约束: 只能向前走 不能落脚在不安全的 ...
- Vj程序设计作业H6
A : 元音跳跃 问题描述 现在有一个长度为 n 的字符串,都有小写字母组成. 输出最长的连续元音的长度 输入格式 第一行一个整数 n , 0≤n≤106 接下来一行表示字符串 输出格式 输出一行,一 ...
- Vj程序设计作业H4
B : 截绳子 题目描述 有 n 段绳子,长短不一.现在要从中截出 k 段长度相同的绳子.当然,一段绳子可以截出来多段绳子.截出来的绳子最长是多少? 输入格式 第一行两个整数 n 和 k (1≤n,k ...
- Vj程序设计作业H7
A : 卖菜 问题描述 在一条街上有 n 个卖菜的商店,按 1 至 n 的顺序排成一排,这些商店都卖一种蔬菜. 第一天,每个商店都自己定了一个价格.店主们希望自己的菜价和其他商店的一致,第二天,每一家 ...
- Vj程序设计作业H10
A : 小明上学 题目背景 小明是汉东省政法大学附属中学的一名学生,他每天都要骑自行车往返于家和学校.为了能尽可能充足地睡眠,他希望能够预计自己上学所需要的时间.他上学需要经过数段道路,相邻两段道路之 ...
- Vj程序设计作业H12
A : 01背包 题目描述 有 N 件物品和一个容量为 V 的背包.第 i 件物品的重量是 w[i],价值是 c[i].求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大. 输 ...
- Vj程序设计作业H8
A : 元音回文 问题描述 现在有一个长度为 n 的字符串,都有小写字母组成. 现在所有元音字母都可以看作相同的字符 输出最长回文子串的长度 一个与自身的逆序相同的字符串即为回文串 比如 aba,aa ...
- 面向对象程序设计作业 6.1~6.4
面向对象程序设计作业 6.1-6.4 面对对象基础题三道.继承多态一道. #include <iostream> #include <string> #include < ...
最新文章
- Linux 用户和用户组配置说明
- Excel 如何根据单元格中的值设立不同的颜色(或渐变)?(222)
- 05_数据的特征处理,归一化,标准化、缺失值处理,以及案例,使用场景,处理办法等
- javaweb利用servlet与struts2实现可点击刷新的基础图片验证码
- ruby hash方法_Ruby中带有示例的Hash.values方法
- python序列中是否包含某个元素
- ConvMixer:7行PyTorch代码实现的网络,就能在ImageNet上达到80%+的精度!
- STM32F103单片机RTC实时时钟的使用
- 21个演示展示强大的jQuery特效
- 使用Volley+OkHttp+Gson加速Android网络开发
- 【毕设教学】 经典单片机控制算法:PID - 嵌入式 物联网
- c语言最短线性路径算法,巧用Excel规划求解最短路径
- Get the information of all heroes in the League of Legends through the crawler.
- 模拟登录上海交大Jaccount
- jQuery便利多个相同的class,点击显示隐藏图标,显示及隐藏其下的内容
- 怎么把图片转PDF格式?转换方法分享
- Nexus搭建Maven私服并使用私服
- About Sealed
- Spring Boot 修改tomcat端口
- NeurIPS'22 | APG:面向CTR预估的自适应参数生成网络