抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

编程月练习题解16-30题

16.预言家(分支)

描述

小 X 是预言家,他有一个 $n\times n$ 的表格,里面从左到右从上到下依次填满从 $1$ 到 $n^2$ 的正整数。

小 Y 来找小 X 预言自己今天晚上会不会被狼人刀,于是小 X 让他从 $1$ 到 $n^2$ 的正整数里随机抽了两个数 $a,b$。如果 $a$ 和 $b$ 在表格中相邻,就会有不祥之兆。

但是小 X 的表格太大了,于是他找到了你并给你了表格边长 $n$ 和小 Y 抽的数 $a,b$,让你帮忙算一下小 Y 今晚是否会有不祥之兆。

输入

仅一行三个整数 $n,a,b$。

输出

一行一个字符串。

如果今晚小 Y 有不祥之兆,输出 Yes,否则输出 No

样例

输入

1
3 4 7

输出

1
Yes

解释

$n=3$ 时表格如下:

1
2
3
1 2 3
4 5 6
7 8 9

显然 4 和 7 相邻。

提示

数据范围:$n\leq 1000 ,1\leq a<b\leq n^2$。

请从标准输入读入数据,将结果输出到标准输出。

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;

int main(){
int n,a,b;
cin>>n>>a>>b;
int max = a>b?a:b;
int min = a+b-max;
if((min%n!=0&&min+1==max)||min+n==max){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}

17.你知道吗(分支)

描述

你知道吗,有的时候汉字的序顺并不一影定响阅读。

Coi 偶然得到了一个包含 32 个整数的序列 $A=(A_0,A_1,\dots,A_{31})$,序列的每个元素都只有两个取值 $0$ 和 $1$。

但是只有 $0$ 和 $1$ 导致 Coi 有的时候并不能准确判断这个序列是否被熊孩子动过,于是他准备将这个序列依照一种关系转换成一个数 $x$,这样辨识度就高了。

定义 $x=A_02^0+A_12^1+\cdots+A_{31}2^{31}$,求 $x$。

输入

一行 32 个整数 $A_0,A_1,\dots,A_{31}$。

输出

一行一个整数 $x$。

样例

输入

1
1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

输出

1
13

提示

数据范围:对于 $0\leq n\leq 31$,$A_n=0$ 或 $1$。

请使用恰当的数据类型存储答案。

请从标准输入读入数据,将结果输出到标准输出。

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <cmath>
using namespace std;

int main(){
unsigned int x = 0;
for(int i =0;i<32;i++){
int in;
cin>>in;
x+=in* pow(2,i);
}
cout<<x<<endl;
}

18.分数(分支)

描述

有的时候人对于等差数列会比较敏感。

比如小 T、小 S 和小 P 一块讨论成绩。小 S 可能会说:你错了两个,你错了四个,我错了六个,这还是个等差数列。

你对这个现象很感兴趣。于是你找到了他们三位并询问到了他们分别错了几个题,你想知道他们错的题数经过重排后是否能构成等差数列。

输入

一行三个正整数 $t,s,p$,表示小 T,小 S 和小 P 错的题数。

输出

一行一个字符串。

如果重排后能构成等差数列,输出 Yes,否则输出 No

样例

输入 1

1
1 5 3

输出 1

1
Yes

输入 2

1
3 5 6

输出 2

1
No

提示

数据范围:$1\leq t,s,p\leq 100$。

请从标准输入读入数据,将结果输出到标准输出。

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;

int min(int a,int b){
return a<b?a:b;
}
int max(int a,int b){
return a<b?b:a;
}

int main(){
int t,s,p;
cin>>t>>s>>p;
int min_num = min(min(t,s),min(t,p));
int max_num = max(max(t,s),max(t,p));
int middle = t+s+p-min_num-max_num;
if(min_num+max_num==2*middle){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}

19.平局大师(分支)

描述

你和 Pam,Icho 一起玩经典的石头剪刀布游戏。

初次见面,他们两个人表示了一种谦让。于是他们商量之后决定先出拳,让你最后出。

你对于这种过度热情并不领情。你决定无论他们出什么,在你出拳之后必定会导致平局。

规定石头为 $0$,剪刀为 $1$,布为 $2$。

输入

两个整数,表示 Pam 和 Icho 出的拳的种类。

输出

一个整数,表示你出的唯一会导致平局的拳。

如果这个整数不存在或不唯一,输出 $-1$。

样例

输入 1:

1
0 1

输出 1:

1
2

输入 2:

1
2 2

输出 2:

1
2

提示

请从标准输入读入数据,将结果输出到标准输出。

题解

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;

int main(){
int a,b;
cin>>a>>b;
if(a==b){
cout<<a<<endl;
}else{
cout<<3-a-b<<endl;
}
}

20.堵王(分支)

描述

扔一个普通六面骰子 $n$ 次,点数总和可能为 $m$ 吗?

输入

一行两个整数 $n,m$。

输出

一行一个字符串。如果可能,输出 Yes;否则输出 No

样例

输入 1:

1
2 11

输出 1:

1
Yes

解释 1:

你可以第一次扔出 5 点,第二次扔出 6 点,点数总和为 11。

也可以第一次扔出 6 点,第二次扔出 5 点,点数总和为 11。

输入 2:

1
2 13

输出 2:

1
No

提示

数据范围:$1\leq n,m\leq 10^8$。

请从标准输入读入数据,将结果输出到标准输出。

题解

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;

int main(){
int n,m;
cin>>n>>m;
if(m<=6*n&&m>=n){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}

21.兔子(循环)

描述

兔子喜欢吃烧烤,人们发现了一种全新的病毒,不同于成龙大哥的传奇游戏,这个病毒可以一刀 999。

是兄弟就来砍我,这个病毒喜欢分裂,分裂的方式不太一样。

病毒分裂第 $i$ 次后拥有的病毒总数,会是前两次病毒分裂后病毒总数的和。

求分裂第 $n$ 次后病毒的总数。

输入

一行一个整数 $n \leq 50$

输出

一行一个整数表示答案。

样例

输入

1
1

输出

1
1

输入

1
2

输出

1
1

输入

1
3

输出

1
2

提示

$n \leq 50$

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;

int main()
{
int n;
cin >> n;
unsigned long long result = 0;
if (n <= 2)
{
cout << 1 << endl;
return 0;
}
unsigned long long min1 = 1, min2 = 1;
for (int i = 2; i < n; i++)
{
result = min1 + min2;
min1 = min2;
min2 = result;
}
cout << result << endl;
return 0;
}

22.什么成分(循环)

描述

人生如梦,终于有一天,界徐盛从床上醒来,他缓缓走出营地,看向了对面的袁绍。

袁绍咧嘴一笑,“袁神,启动!”,刹那间万箭齐发。

大宝猛喝一口酒,拿起古锭刀,嘴角呈现出畅快的笑容,“犯我大吴疆土者,盛必击破之!”,大宝看向了一旁看戏的冲儿,“给冲儿来刀狠的!”

曹冲仔细思考了一下,大声喊道,“依我看,小事一桩!”

曹冲决定开始称象,曹冲可以称量重量在 $[L, R]$ 里面的大象,对于一个重量为 $x$ 的大象,我们希望找到可以和这个大象一起玩原神的大象。

如果一个大象 $a$ 和另一个大象 $b$ 可以一起玩原神,那么大象 $a$ 的重量假如为 $45678$,一定是可以由移动后面的一部分到前面去形成的新重量,比如 $84567,78456,67845,56784$ 这四个数重量的大象可以和大象 $a$ 一起玩原神。

请问在有多少对 $(a,b)$ 可以一起玩原神,其中 $a,b$ 分别为两头大象的重量,$L\leq a < b\leq R$,输出数量。

输入

第一行两个数 $L, R$,满足 $1 \leq L \leq R \leq 10^7$。

输出

输出有多少对合法的 $(a, b)$。

样例

输入

1
10 12311

输出

1
13198

提示

$1 \leq L \leq R \leq 10^7$。

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <vector>
#include <unordered_set>
#include <string>
#include <algorithm>
using namespace std;
#include <vector>
#include <cmath>

std::vector<int> get_rotations(int x) {
int n = std::to_string(x).size();
std::vector<int> rotations;
rotations.reserve(n- 1);
int power = pow(10, n - 1);
int current = x;
for (int i = 1; i < n; ++i) {
int last_digit = current % 10;
current = last_digit * power + (current / 10);
if (current != x) {
rotations.push_back(current);
}
}
return rotations;
}

int main() {
int L, R;
cin >> L >> R;
int count = 0;
for (int a = L; a < R; ++a) {
string s = to_string(a);
unordered_set<int> rotations_a;
vector<int> rotations = get_rotations(a);
for (int r : rotations) {
if (r > a && r <= R) {
rotations_a.insert(r);
}
}
count += rotations_a.size();
}
cout << count << endl;
return 0;
}

23.赌王(循环)

描述

赌王正在打牌,现在他手上有 $n$ 张牌,每张牌可以看成是一原石,一原石等价于一美元,所以赌王的收入已经超越了大部分人,现在坐在赌王对面的是赌怪,赌怪会变魔法,可以删去前面长度为 $k$ 的一段,并且使后面多出一段全部为 $0$ 的长度为 $k$ 的序列。

请你当赌怪,输出这个最后被变过魔法的序列。

输入

第 $1$ 行两个整数 $n, k$,表示序列长度和魔法长度,$n,k \leq 10^6$

第二行 $n$ 个整数,表示序列中的每个元素

输出

输出最终的序列。

样例

输入

1
2
3 1
1 2 3

输出

1
2 3 0

提示

请从标准输入读入数据,将结果输出到标准输出。详见示例程序
输入数据包含多组数据,可以读一组,计算一组,输出一组。

$n,k \leq 10^6$

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;

int main()
{
int n, k;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++)
{
int ni;
scanf("%d", &ni);
if (i >= k)
{
printf("%d ", ni);
}
}
for (int i = 0; i < k - 1; i++)
{
printf("0 ");
}
printf("0\n");
return 0;
}

24.值夜者(循环)

描述

廷根市值夜者小队负责与廷根市其他官方非凡者一同处理辖区内的非凡事件,为廷根市的治安做出了杰出贡献,与此同时,他们也付出过多位成员殉职的代价。

唯一的归宿是安宁,愿他们在女神的神国中安息,赞美女神。

廷根市执夜小队拥有自己的密码暗号,用来打开通往非凡世界的门,具体的,一个形如样例中模样的大小为 $n$ 的楼梯,每行比上一行多一个 *

输入

一行一个整数 $n$

输出

输出最终的三角形

样例

输入

1
3

输出

1
2
3
*
**
***

输入

1
4

输出

1
2
3
4
*
**
***
****

提示

请从标准输入读入数据,将结果输出到标准输出。详见示例程序
输入数据包含多组数据,可以读一组,计算一组,输出一组。

$n \le 1000$

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;

int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
printf("*");
}
printf("\n");
}
return 0;
}

25.大头儿子和小头爸爸(循环)

描述

大头儿子和小头爸爸一起出去吃饭,大头儿子吃饭一次能吃 $a$ 斤,小头爸爸吃饭一次能吃 $b$ 斤,大头儿子的妈妈是金发妹熊二,熊二被熊大赶出来之后只能靠捡垃圾吃为生,熊二一次能吃 $c$ 斤饭,熊二喜欢去找光头强要饭吃,这一天,金发妹熊二从叔叔那里借来了 $n$ 斤饭。

金发妹希望他们能够尽可能多的吃完 $n$ 斤饭,吃饭的同时,来自提瓦特的克拉拉告诉熊二,肯德基爷爷希望大头儿子、小头爸爸、熊二三人最终每人吃饭的斤数的极差最小,请你输出他们最多能吃多少斤饭,以及此时极差最小为多少。

注意,每个人都必须吃饭,不可以不吃饭,如果有人无法吃饭,输出 -1 -1

输入

一行四个整数n,a,b,c
$2 \leq a, b, c \leq 40, n \leq 500$

输出

输出两个整数,中间空格,第一个代表最多吃了多少饭,第二个代表极差。

样例

输入

1
500 20 10 10

输出

1
500 10

输入

1
40 20 20 20

输出

1
-1 -1

提示

$2 \leq a, b, c \leq 40, n \leq 500$

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
int n, a, b, c;
cin >> n >> a >> b >> c;

int max_food = -1;
int min_diff = INT_MAX;
if (a + b + c > n) {
cout << "-1 -1" << endl;
return 0;
}
// 这里暴力居然过了,不管了
for (int x = 1; x <= (n - b - c) / a; ++x) {
for (int y = 1; y <= (n - a * x - c) / b; ++y) {
int remaining = n - a * x - b * y;
if (remaining >= c) {
int z = remaining / c;
if (z >= 1) {
int total = a * x + b * y + c * z;
int eat_a = a * x;
int eat_b = b * y;
int eat_c = c * z;
int current_max = max({eat_a, eat_b, eat_c});
int current_min = min({eat_a, eat_b, eat_c});
int diff = current_max - current_min;
if (total > max_food || (total == max_food && diff < min_diff)) {
max_food = total;
min_diff = diff;
}
}
}
}
}

if (max_food == -1) {
cout << "-1 -1" << endl;
} else {
cout << max_food << " " << min_diff << endl;
}

return 0;
}

26.麻将(循环)

描述

大壮喜欢打麻将,这一天,熊二吃到了香喷喷,于是吉吉国王希望你从 $n$ 个数中输出他们的平均数,并保留两位小数。

输入

第一行一个整数 $n$,第二行 $n$ 个整数

输出

输出一个两位小数

样例

输入

1
2
2
3 3

输出

1
3.00

提示

$n \le 10^6$

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
int n;
scanf("%d",&n);
long long sum = 0;
for (int i = 0; i < n; ++i) {
int num;
scanf("%d",&num);
sum += num;
}
double average = static_cast<double>(sum) / n;
printf("%.2lf",average);
return 0;
}

27.斗地主(循环)

描述

大蒜喜欢斗地主,这一天腾讯推出了胆小模式,但是麻雀仍然在喝桂花酒,四瓶桂花酒,每瓶编号 $x \sim y$,请问它们能组成多少个数字各不相同的四位数,输出你的答案。

输入

两个数 $0\leq x \leq y \leq 9$

输出

输出一个整数

样例

输入

1
2 6

输出

1
120

提示

$0\leq x \leq y \leq 9$

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using namespace std;

int A_count(int num1,int num2){
int result1 = 1,result2=1;
for(int i=1;i<=num1;i++){
result1*=i;
}
for(int i=1;i<=num1-num2;i++){
result2*=i;
}
return result1/result2;
}

int main() {
int x, y;
cin >> x >> y;
int count = y - x + 1;
if (count < 4) {
cout << 0 << endl;
} else {
if(x>0){
printf("%d",A_count(count,4));
}else{
printf("%d",A_count(count,4)-A_count(count-1,3));
}
}
return 0;
}

28.只因兔同笼(循环)

描述

从小到大,小明都被熊大熊二问着西天取经上必须回答的问题,那就是鸡兔同笼问题,今天他吃了妙脆角,需要你帮他回答这个问题

输入

一行两个整数 $n, m \leq 10^4$,n代表头数,m代表腿的数量

输出

输出两个整数,中间空格,第一个代表鸡的数量,第二个代表兔的数量

样例

输入

1
30 90

输出

1
15 15

提示

$n, m \leq 10^4$

题解

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;

int main(){
int n,m;
scanf("%d%d",&n,&m);
int x = (4*n-m)/2,
y = (m-2*n)/2;
printf("%d %d",x,y);
}

29.高斯(循环)

描述

高斯,伟大的数学家,请你计算 $\sum_{i=1}^n i^2$。

输入

一个整数 $n \leq 100$

输出

输出一个整数,计算结果。

样例

输入

1
1

输出

1
1

提示

$n \leq 100$

题解

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;

int main(){
unsigned long long result = 0;
int n;
scanf("%d",&n);
for(int i = 1;i<=n;i++){
result+=i*i;
}
printf("%llu",result);
}

30.宇宙超人(循环)

描述

你好,宇宙超人,睁开眼睛,这里有两个数,$x, y$,请你使用循环求出最大公约数。

输入

一行两个整数 $x,y \leq 100000$

输出

输出一个整数

样例

输入

1
2 4

输出

1
2

提示

$x,y \leq 100000$

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;

int main() {
int x, y;
cin >> x >> y;

while (y != 0) {
int temp = y;
y = x % y;
x = temp;
}

cout << x << endl;
return 0;
}

评论