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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
create database ex3_2;
use ex3_2;
create table if not exists S(
SNO varchar(10) PRIMARY KEY,
SNAME varchar(10),
STATUS int,
CITY varchar(10)
) engine=innodb default charset=utf8;

create table if not exists P(
PNO varchar(10) PRIMARY KEY,
PNAME varchar(10),
COLOR varchar(10),
WEIGHT int
)engine=innodb default charset=utf8;

create table if not exists J(
JNO varchar(10) PRIMARY KEY ,
JNAME varchar(10),
CITY varchar(10)
)engine=innodb default charset=utf8;

create table if not exists SPJ(
SNO varchar(10) ,
PNO varchar(10) ,
JNO varchar(10) ,
QTY int,
foreign key(SNO) references S(SNO),
foreign key(PNO) references P(PNO),
foreign key(JNO) references J(JNO),
primary key(SNO,PNO,JNO)
)engine=innodb default charset=utf8;

insert into s values('s1','精益',20,'天津'),
('s2','盛锡',10,'北京'),
('s3','东方红',30,'北京'),
('s4','丰泰盛',20,'天津'),
('s5','为民',30,'上海');
insert into p values('p1','螺母','红',12),
('p2','螺栓','绿',17),
('p3','螺丝刀','蓝',14),
('p4','螺丝刀','红',14),
('p5','凸轮','蓝',40),
('p6','齿轮','红',30);
insert into j values('j1','三建','北京'),
('j2','一汽','长春'),
('j3','弹簧厂','天津'),
('j4','造船厂','天津'),
('j5','机车厂','唐山'),
('j6','无线电厂','常州'),
('j7','半导体厂','南京');
insert into spj values('s1','p1','j1',200),
('s1','p1','j3',100),
('s1','p1','j4',700),
('s1','p2','j2',100),
('s2','p3','j1',400),
('s2','p3','j2',200),
('s2','p3','j4',500),
('s2','p3','j5',400),
('s2','p5','j1',100),
('s2','p5','j2',200),
('s3','p1','j1',200),
('s3','p3','j1',100),
('s4','p5','j1',300),
('s4','p6','j3',200),
('s5','p6','j4',100),
('s5','p2','j4',100),
('s5','p3','j1',200),
('s5','p6','j2',200),
('s5','p6','j4',500);

陈老师留的Java课后思考题,感觉挺好玩。
顺便学习一下 STL 的用法。

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import java.util.HashSet;
import java.util.Set;

public class Main {
public static void main(String[] args) {
int n = (int) (Math.random() * 5) * 2 + 3;
System.out.printf("随机一个奇数n = %d\n", n);
System.out.println("************************");
int[][] matrix = new int[n][n];
// 1. 先填入 1
int cnt = 1;
int i = 0, j = n / 2;
matrix[i][j] = cnt++;
// 2. 填入2 ~ n^2
while (cnt <= n * n) {
// 先填右上角
i = (i - 1 + n) % n;
j = (j + 1) % n;
// 如果有数了,就填到原数的下面
if (matrix[i][j] != 0) {
i = (i + 2) % n;// 下面一行
j = (j - 1 + n) % n;// 原来的列
}
matrix[i][j] = cnt++;
}
// print
for (int ii = 0; ii < n; ii++) {
for (int jj = 0; jj < n; jj++) {
System.out.printf("%4d", matrix[ii][jj]);
}
System.out.println();
}
System.out.println("************************");
if (check(matrix, n)) {
System.out.println("填数正确");
} else {
System.out.println("填数错误");
}
}

private static boolean check(int matrix[][], int n) {
System.out.println("**********check*********");
Set<Integer> set = new HashSet<>();
for (int ii = 0; ii < n; ii++) {
int sum = 0;
for (int jj = 0; jj < n; jj++) {
sum += matrix[ii][jj];
}
set.add(sum);
System.out.printf("第 %d 行的和为 %d\n", ii + 1, sum);
}
System.out.println("************************");
for (int jj = 0; jj < n; jj++) {
int sum = 0;
for (int ii = 0; ii < n; ii++) {
sum += matrix[ii][jj];
}
set.add(sum);
System.out.printf("第 %d 列的和为 %d\n", jj + 1, sum);
}
System.out.println("************************");
int sum = 0;
for (int ii = 0; ii < n; ii++) {
sum += matrix[ii][ii];
}
set.add(sum);
System.out.printf("主对角线的和为 %d\n", sum);
System.out.println("************************");
sum = 0;
for (int ii = 0; ii < n; ii++) {
sum += matrix[ii][n - ii - 1];
}
set.add(sum);
System.out.printf("副对角线的和为 %d\n", sum);
System.out.println("************************");
if (set.size() == 1) {
return true;
} else {
return false;
}
}

}

感谢:https://wenku.baidu.com/view/287eae9b7d1cfad6195f312b3169a4517623e552.html

https://pintia.cn/problem-sets/1547030907058900992/problems/type/7

https://bytodance.feishu.cn/docx/doxcnlU4LYJDgWIdAcmpHloAMoe

7-1 分解质因数

分数 10

作者 林生佑

单位 浙江传媒学院

求出区间[a,b]中所有整数的质因数分解,2<=a<=b<=10000。

输入格式:

输入两个整数a,b。

输出格式:

每行输出一个数的分解,形如k=a1_a2_a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)

输入样例:

1
3 10

输出样例:

1
2
3
4
5
6
7
8
3=3
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5

AC 代码

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
46
47
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;

const int N = 1e5 + 10;
int cnt, primes[N];
bool st[N];

void get_primes(int n) {
for (int i = 2; i <= n / i; i++) {
if (!st[i]) {
primes[cnt++] = i;
for (int j = i; j <= n; j += i) st[j] = true;
}
}
}

int main() {
int a, b;
cin >> a >> b;
get_primes(b);
for (int i = a; i <= b; i++) {
int t = i;
vector<int> res;

for (int j = 0; j < cnt && primes[j] < t; j++) {
if (t % primes[j] == 0) {
while (t % primes[j] == 0) {
res.push_back(primes[j]);
t /= primes[j];
}
}
}
if (t > 1) res.push_back(t);

cout << i << '=';
for (int j = 0; j < res.size(); j++) {
if (j > 0) cout << '*';
cout << res[j];
}
cout << endl;
}

return 0;
}

7-2 “接肢”葛瑞克

分数 20

作者 xxxtentx

单位 江西财经大学

欢迎来到交界之地,褪色者。
恶名昭彰的BOSS“接肢”葛瑞克通过接肢来提升自己的力量,但是最初的葛瑞克十分弱小,接肢数量仅为可怜的1。接下来褪色者会和葛瑞克进行战斗。
假设褪色者面对葛瑞克战败后,再一次挑战葛瑞克时,葛瑞克会在自己原来的身体上通过接肢加强自己的力量,而接肢的数量是以指数递增的。比如褪色者第二次挑战时(假设褪色者不可能第一次就打败葛瑞克),接肢的数量就是第一次的数量 * 2,第三次挑战就是第二次的数量 * 3,以此类推。
褪色者通过攻击来解肢击败葛瑞克,而褪色者的攻击伤害只有质数才会对BOSS造成伤害,合数的攻击对于BOSS无效。且每次攻击伤害都只能从2开始,除非本次攻击无法完全整数解肢(比如接肢数量为21时,伤害为2无法解肢,只有伤害增加到3时才可以攻击BOSS解肢,攻击后接肢数量为7),那么就会伤害增加一点继续攻击BOSS。
当葛瑞克的接肢数量回到最初的起点的时候,即为战胜BOSS。

输入格式:

题目给出褪色者最终战胜葛瑞克所挑战的次数n。

输出格式:

题目要求你输出战胜葛瑞克时,褪色者的攻击的伤害a和伤害a的攻击次数b,a和b之间用空格隔开。并且每一组伤害独占一行输出,且每一行依次递增的输出伤害。

数据范围:

2 ≤ n ≤ 106

输入样例:

1
5

输出样例:

1
2
3
2 3
3 1
5 1

AC 代码

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
46
47
48
49
50
51
52
53
#include <algorithm>
#include <cstring>
#include <iostream>
#include <map>
using namespace std;

const int N = 1e6 + 10;
int cnt, primes[N];
bool st[N];

void get_primes(int n) {
for (int i = 2; i <= n; i++) {
if (!st[i]) {
primes[cnt++] = i;
for (int j = i; j <= n; j += i) st[j] = true;
}
}
}

int main() {
get_primes(1e6);
int n;
// 题目给出褪色者最终战胜葛瑞克所挑战的次数n。
cin >> n;
// 第几次打败葛瑞克
int cnt = 1;
// 当前接肢数量
int cur = 2;
// 接肢的数量是以指数递增
int exp = 2;
// 当前攻击的力度,必须是质数,所以就用primes[]数组的下标表示
int idx = 0;
map<int, int> mp;
do {
// 只有质数才会对BOSS造成伤害 整数解肢
if (cur % primes[idx] == 0) {
cur /= primes[idx];
mp[primes[idx]]++;
idx = 0;
} else
idx++;
// 如果回到了1,证明被战胜了
if (cur == 1) {
cnt++;
cur = 1;
// 接肢的数量是以指数递增的
cur *= (++exp);
}
} while (cnt != n);
// 输出结果
for (auto it : mp) cout << it.first << " " << it.second << endl;
return 0;
}

7-3 大整数A+B

分数 5

全屏浏览题目

切换布局

作者 HDOJ

单位 绍兴文理学院

输入两个整数A、B,求 A + B。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入2个正整数A、B。整数可能很大,但每个整数的位数不会超过1000。

输出格式:

对于每组测试输出两行数据;第一行输出”Case #:”,#表示测试组号,第二行输出形式为“A + B = Sum”,Sum表示A+B的结果。每两组测试数据之间空一行。

输入样例:

1
2
3
2
1 2
88888888888888888888888 11111111111111111111111

AC 代码

输出样例:

1
2
3
4
5
Case 1:
1 + 2 = 3

Case 2:
88888888888888888888888 + 11111111111111111111111 = 99999999999999999999999

出处:

HDOJ 1002

1
2
3
4
5
6
7
T = int(input())
for i in range(1, T + 1):
a, b = map(int, input().split())
print('Case %d:' % i)
print(a, '+', b, '=', a + b)
if i != T:
print()

7-4 大整数A-B

分数 5

全屏浏览题目

切换布局

作者 xxxtentx

单位 江西财经大学

给定两个正整数(不含前导0),计算它们的差,计算结果可能为负数。

输入格式:

共两行,每行包含一个整数。

输出格式:

共一行,包含所求的差。

数据范围:

1 ≤ 整数长度 ≤ 105

输入样例:

在这里给出一组输入。例如:

1
2
32
11

输出样例:

在这里给出相应的输出。例如:

1
21

AC 代码

1
2
3
a = int(input())
b = int(input())
print(a - b)

7-5 高精度A * 低精度b

分数 5

作者 xxxtentx

单位 江西财经大学

给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。

输入格式:

共两行,第一行包含整数 A,第二行包含整数 B。

输出格式:

共一行,包含 A×B 的值。

数据范围:

1 ≤ A的长度 ≤ 100000,
0 ≤ B ≤ 10000

输入样例:

在这里给出一组输入。例如:

1
2
2
3

输出样例:

1
6

AC 代码

1
2
3
a = int(input())
b = int(input())
print(a * b)

7-6 整除光棍

分数 20

作者 翁恺

单位 浙江大学

这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

输入格式:

输入在一行中给出一个不以5结尾的正奇数x(<1000)。

输出格式:

在一行中输出相应的最小的sn,其间以1个空格分隔。

输入样例:

1
31

输出样例:

1
3584229390681 15

AC 代码

模拟除法,先找到一个比所求大的111…,再输出除以n的商

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
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int main() {
int n, chushu = 1, weishu = 1;
cin >> n;
// 先找到一个比所求大的111...
while (chushu < n) {
chushu = chushu * 10 + 1;
weishu++;
}
while (1) {
// 再输出除以n的商
cout << chushu / n;
// 如果整除就返回
if (chushu % n == 0) break;
// 加一个 1 继续除
chushu = (chushu % n) * 10 + 1;
// 位数 + 1
weishu++;
}
cout << ' ' << weishu;
return 0;
}

7-7 h0054. 欧几里得的问题

分数 10

全屏浏览题目

切换布局

作者 黄正鹏

单位 贵州工程应用技术学院

由欧几里得的辗转相除法可知,对于任何正整数 A
和 B ,都存在这样的整数 X 和 Y , AX+BY=D ,其中 D 是
A 和 B 的最大公约数。本题要求,对于给定的 A 和 B ,
找到对应的 X , Y 和 D 。

输入格式:

输入给出一些行,每行由空格隔开的整数 A 和 B 组成, 0<A,
B<1000000001 。

输出格式:

对于每个输入行,输出一行,由三个用空格隔开的整数 X 、 Y 和 D组成。如果有若干个满足条件的 X 和 Y ,那么就输出 |X |+|Y| 最小的那对。如果还是有若干个 X 和 Y 满足最小准则,则输出 X≤Y 的那一对。

输入样例:

1
2
4 6
17 17

输出样例:

1
2
-1 1 2
0 1 17

AC 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int exgcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
int x1, y1, gcd;
gcd = exgcd(b, a % b, x1, y1);
x = y1, y = x1 - a / b * y1;
return gcd;
}
int main() {
int a, b, x, y;
while (cin >> a >> b) {
exgcd(a, b, x, y);
cout << x << " " << y << " " << a * x + b * y << endl;
}
return 0;
}

7-8 组合数问题

分数 25

全屏浏览题目

切换布局

作者 CCF_NOIP

单位 江西财经大学

组合数 Cnm​ 表示的是从 n 个物品中选出 m 个物品的方案数。举个例子,从 (1,2,3) 三个物品中选择两个物品可以有 (1,2),(1,3),(2,3) 这三种选择方法。根据组合数的定义,我们可以给出计算组合数 Cnm​ 的一般公式:

Cnm​=m!(n−m)!n!​

其中 n!=1×2×⋯×n;特别地,定义 0!=1。

小葱想知道如果给定 n,m 和 k,对于所有的 0≤i≤n,0≤j≤min(i,m) 有多少对 (i,j) 满足 Cij​ 是 k 的倍数。

输入格式:

第一行有两个整数 t,k,其中 t 代表该测试点总共有多少组测试数据,k 的意义见问题描述。

接下来 t 行每行两个整数 n,m,其中 n,m 的意义见问题描述。

输出格式:

共 t 行,每行一个整数代表所有的 0≤i≤n,0≤j≤min(i,m) 中有多少对 (i,j) 满足 Cij​ 是 k 的倍数。

数据范围:

0≤n,m≤2×103,
2≤k≤21,
1≤t≤104

输入样例:

在这里给出一组输入。例如:

1
2
1 2
3 3

输出样例:

在这里给出相应的输出。例如:

1
1

提示

【样例说明】

在所有可能的情况中,只有 C21​=2 一种情况是 2 的倍数。

AC 代码

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 <algorithm>
#include <cstring>
#include <iostream>

using namespace std;

const int N = 2010;

int c[N][N];
// 前缀和
int s[N][N];

int main() {
int T, k;
scanf("%d%d", &T, &k);

// 预处理前缀和

for (int i = 0; i < N; i++)
// 求余数
for (int j = 0; j <= i; j++) {
if (j == 0)
c[i][j] = 1 % k;
else
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % k;
// 如果是余数0,就代表就有一次
if (c[i][j] == 0) s[i][j] = 1;
}
//
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++) {
if (i != 0) s[i][j] += s[i - 1][j];
if (j != 0) s[i][j] += s[i][j - 1];
if (i != 0 && j != 0) s[i][j] -= s[i - 1][j - 1];
}

while (T--) {
int n, m;
scanf("%d%d", &n, &m);

printf("%d\n", s[n][m]);
}

return 0;
}

1-1 日期格式化

分数 5

全屏浏览题目

切换布局

作者 陈越

单位 浙江大学

世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。

输入格式:

输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。

输出格式:

在一行中按照“yyyy-mm-dd”的格式给出年、月、日。

输入样例:

1
03-15-2017

输出样例:

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

int main()
{
string s;
cin >> s;
cout << s[6] << s[7] << s[8] << s[9] << '-';
cout << s[0] << s[1] << '-';
cout << s[3] << s[4] << endl;
return 0;
}

1-2 比较大小

分数 10

全屏浏览题目

切换布局

作者 杨起帆

单位 浙大城市学院

本题要求将输入的任意3个整数从小到大输出。

输入格式:

输入在一行中给出3个整数,其间以空格分隔。

输出格式:

在一行中将3个整数从小到大输出,其间以“->”相连。

输入样例:

1
4 2 8

输出样例:

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

int main()
{
int a, b, c;
cin >> a >> b >> c;
if(a > b) swap(a,b);
if(b > c) swap(b,c);
if(a > b) swap(a,b);
cout << a << "->" << b << "->" << c << endl;
return 0;
}

1-3 6翻了

分数 15

全屏浏览题目

切换布局

作者 陈越

单位 浙江大学

666.JPG

“666”是一种网络用语,大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思。如果你以为这就是厉害的最高境界,那就错啦 —— 目前的最高境界是数字“27”,因为这是 3 个 “9”!

本题就请你编写程序,将那些过时的、只会用一连串“6666……6”表达仰慕的句子,翻译成最新的高级表达。

输入格式:

输入在一行中给出一句话,即一个非空字符串,由不超过 1000 个英文字母、数字和空格组成,以回车结束。

输出格式:

从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。其他内容不受影响,原样输出。

输入样例:

1
it is so 666 really 6666 what else can I say 6666666666

输出样例:

1
it is so 666 really 9 what else can I say 27
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
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;

int main() {
string s;
getline(cin, s);
for (int i = 0; i < s.size(); i++) {
bool flag = false;
int cnt = 1;
int j = i + 1;
if (s[i] == '6') {
while (s[j++] == '6') cnt++;
if (cnt > 9) {
flag = true;
cout << "27";
} else if (cnt > 3) {
flag = true;
cout << "9";
}
}
if (flag) {
i = j - 2;
continue;
}
cout << s[i];
}
return 0;
}

1-4 考试座位号

分数 15

全屏浏览题目

切换布局

作者 陈越

单位 浙江大学

每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。

输入格式:

输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号。其中准考证号由 16 位数字组成,座位从 1 到 N 编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。

考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。

输出格式:

对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。

输入样例:

1
2
3
4
5
6
7
4
3310120150912233 2 4
3310120150912119 4 1
3310120150912126 1 3
3310120150912002 3 2
2
3 4

输出样例:

1
2
3310120150912002 2
3310120150912119 1
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
#include <algorithm>
#include <cstring>
#include <iostream>
#include <map>
#define x first
#define y second
using namespace std;
// 准考证 考试座位号
typedef pair<string, string> PII;
// 座位号
map<int, PII> m;

int main() {
int N;
cin >> N;
while (N--) {
string a, c;
int b;
cin >> a >> b >> c;
m[b] = {a, c};
}
int M;
cin >> M;
while (M--) {
int a;
cin >> a;
cout << m[a].x << " " << m[a].y << endl;
}
return 0;
}

1-5 天梯赛的善良

分数 20

全屏浏览题目

切换布局

作者 陈越

单位 浙江大学

天梯赛是个善良的比赛。善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分。

于是命题组首先将编程能力划分成了 106 个等级(太疯狂了,这是假的),然后调查了每个参赛学生的编程能力。现在请你写个程序找出所有参赛学生的最小和最大能力值,给命题组作为出题的参考。

输入格式:

输入在第一行中给出一个正整数 N(≤2×104),即参赛学生的总数。随后一行给出 N 个不超过 106 的正整数,是参赛学生的能力值。

输出格式:

第一行输出所有参赛学生的最小能力值,以及具有这个能力值的学生人数。第二行输出所有参赛学生的最大能力值,以及具有这个能力值的学生人数。同行数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

1
2
10
86 75 233 888 666 75 886 888 75 666

输出样例:

1
2
75 3
888 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <algorithm>
#include <cstring>
#include <iostream>
#include <map>
#define x first
#define y second
using namespace std;

map<int, int> m;

int main() {
int N;
cin >> N;
while (N--) {
int t;
cin >> t;
m[t]++;
}
cout << m.begin()->x << ' ' << m.begin()->y << endl;
cout << m.rbegin()->x << ' ' << m.rbegin()->y << endl;
return 0;
}

1-6 机工士姆斯塔迪奥

分数 20

全屏浏览题目

切换布局

作者 DAI, Longao

单位 杭州百腾教育科技有限公司

在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。

你需要处理这个副本其中的一个机制:N×M 大小的地图被拆分为了 N×M 个 1×1 的格子,BOSS 会选择若干行或/及若干列释放技能,玩家不能站在释放技能的方格上,否则就会被击中而失败。

给定 BOSS 所有释放技能的行或列信息,请你计算出最后有多少个格子是安全的。

输入格式:

输入第一行是三个整数 N,M,Q (1≤N×M≤105,0≤Q≤1000),表示地图为 N 行 M 列大小以及选择的行/列数量。

接下来 Q 行,每行两个数 Ti​,Ci​,其中 Ti​=0 表示 BOSS 选择的是一整行,Ti​=1 表示选择的是一整列,Ci​ 为选择的行号/列号。行和列的编号均从 1 开始。

输出格式:

输出一个数,表示安全格子的数量。

输入样例:

1
2
3
4
5 5 3
0 2
0 4
1 3

输出样例:

1
12
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
#include <algorithm>
#include <cstring>
#include <iostream>
#include <map>
#include <set>
#define x first
#define y second
using namespace std;

int n, m, q;
set<int> r, c;
int main() {
cin >> n >> m >> q;
int T, C;
while (q--) {
cin >> T >> C;
if (T == 0) {
r.insert(C);
} else {
c.insert(C);
}
}
cout << (n - r.size()) * (m - c.size()) << endl;
return 0;
}

1-7 估值一亿的AI核心代码

分数 20

全屏浏览题目

切换布局

作者 陈越

单位 浙江大学

AI.jpg

以上图片来自新浪微博。

本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

  • 无论用户说什么,首先把对方说的话在一行中原样打印出来;
  • 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
  • 把原文中所有大写英文字母变成小写,除了 I
  • 把原文中所有独立的 can youcould you 对应地换成 I canI could—— 这里“独立”是指被空格或标点符号分隔开的单词;
  • 把原文中所有独立的 I 和 me 换成 you
  • 把原文中所有的问号 ? 换成惊叹号 !
  • 在一行中输出替换后的句子作为 AI 的回答。

输入格式:

输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。

输出格式:

按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。

输入样例:

1
2
3
4
5
6
7
6
Hello ?
Good to chat with you
can you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know

输出样例:

1
2
3
4
5
6
7
8
9
10
11
12
Hello ?
AI: hello!
Good to chat with you
AI: good to chat with you
can you speak Chinese?
AI: I can speak chinese!
Really?
AI: really!
Could you show me 5
AI: I could show you 5
What Is this prime? I,don 't know
AI: what Is this prime! you,don't know
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <algorithm>
#include <cstring>
#include <iostream>

using namespace std;

int main() {
int n;
cin >> n;
string s;
getline(cin, s);
while (n--) {
string s;
getline(cin, s);

// 无论用户说什么,首先把对方说的话在一行中原样打印出来;
cout << s << endl;

// 把行首尾的空格全部删掉
// s.erase(1); 删除集合s中的1这个元素
// s.erase(s.begin()); 删除集合s中的第一个元素
// s.erase(s.end() - 1); 删除集合s中的最后一个元素
while (s[0] == ' ') s.erase(s.begin());
while (s[s.size() - 1] == ' ') s.erase(s.end() - 1);
// 把相邻单词间的多个空格换成 1 个空格,把标点符号前面的空格删掉;
for (int i = 0; i < s.size(); i++) {
if (s[i] == ' ') {
while (s[i + 1] == ' ') s.erase(s.begin() + i + 1);
// isalnum() 函数用于检测字符串是否只包含字母和数字。
// !isalnum() 检测是否是空格和标点符号。
if (!isalnum(s[i + 1])) s.erase(s.begin() + i);
}
}

// 把原文中所有大写英文字母变成小写,除了 I;
for (int i = 0; i < s.size(); i++)
// isupper() 函数检测是否是大写字母。
if (isupper(s[i]) && s[i] != 'I')
s[i] = tolower(s[i]); // tolower() 函数用于把字符转换为小写。

// 把原文中所有独立的 can you、could you 对应地换成 I can、I could——
// 这里“独立”是指被空格或标点符号分隔开的单词;
for (int beg = 0;; beg++) {
beg = s.find("can you", beg);
if (beg == -1) break;
if ((beg == 0 || !isalnum(s[beg - 1])) &&
(beg + 7 == s.size() || !isalnum(s[beg + 7]))) {
s.replace(beg, 7, "A can");
}
}
// 由于后面还要处理'I'这里先用'A'代替'I',最后在变成'I'
for (int beg = 0;; beg++) {
beg = s.find("could you", beg);
if (beg == -1) break;
if ((beg == 0 || !isalnum(s[beg - 1])) &&
(beg + 9 == s.size() || !isalnum(s[beg + 9]))) {
s.replace(beg, 9, "A could");
}
}
// 把原文中所有独立的 I 和 me 换成 you;
for (int beg = 0;; beg++) {
beg = s.find("I", beg);
if (beg == -1) break;
if ((beg == 0 || !isalnum(s[beg - 1])) &&
(beg + 1 == s.size() || !isalnum(s[beg + 1]))) {
s.replace(beg, 1, "you");
}
}
for (int beg = 0;; beg++) {
beg = s.find("me", beg);
if (beg == -1) break;
if ((beg == 0 || !isalnum(s[beg - 1])) &&
(beg + 2 == s.size() || !isalnum(s[beg + 2]))) {
s.replace(beg, 2, "you");
}
}

// 把原文中所有的问号 ? 换成惊叹号 !;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '?') s[i] = '!';
if (s[i] == 'A') s[i] = 'I';
}

// 在一行中输出替换后的句子作为 AI 的回答。
cout << "AI: " << s << endl;
}
return 0;
}

https://pintia.cn/problem-sets/1546381984669618176

7-1 求素数

分数 5

作者 唐艳琴

单位 中国人民解放军陆军工程大学

本题目要求读入1个正整数A,判断A是否为素数。

输入格式:

输入1个正整数A。

输出格式:

输出A是或否为素数。

输入样例:

1
2

输出样例:

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

typedef long long LL;

bool isPrime(LL t) {
if (t < 2) return false;
for (LL i = 2; i <= t / i; i++)
if (t % i == 0) return false;
return true;
}

int main() {
LL t;
cin >> t;
cout << t << ' ' << (string)(isPrime(t) ? "yes" : "no") << endl;
return 0;
}

7-2 进制转换

分数 5

作者 wangxj

单位 临沂大学

输入一个十进制的整数。将它转换为二进制数、八进制数和十六进制数。

输入格式:

输入一个不超过100的十进制整数。

输出格式:

在一行内输出对应的二进制数、八进制数和十六进制数,以空格隔开。

输入样例:

在这里给出一组输入。例如:

1
8

输出样例:

在这里给出相应的输出。例如:

1
1000 10 8
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
46
47
48
49
50
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;

void to_2(int n) {
int a[1000];
int num = 0;
do {
a[num++] = n % 2;
n /= 2;
} while (n != 0);
for (int i = num - 1; i >= 0; i--) cout << a[i];
cout << ' ';
return;
}

void to_8(int n) {
int a[1000];
int num = 0;
do {
a[num++] = n % 8;
n /= 8;
} while (n != 0);
for (int i = num - 1; i >= 0; i--) cout << a[i];
cout << ' ';
return;
}

char h[17] = {'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
void to_16(int n) {
int a[1000];
int num = 0;
do {
a[num++] = n % 16;
n /= 16;
} while (n != 0);
for (int i = num - 1; i >= 0; i--) cout << h[a[i]];
return;
}

int main() {
int t;
cin >> t;
to_2(t);
to_8(t);
to_16(t);
return 0;
}

7-3 欧拉筛

分数 10

作者 c++课程组

单位 湖州师范学院

求1~n区间有多少个素数。(n<4×107)

输入格式:

一个数n

输出格式:

一个数,表示1~n区间有多少个素数。

输入样例:

1
10

输出样例:

1
4
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
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 4e7 + 10;

//primes数组用来存放质数
int primes[N], cnt;
//st[i], i为质数则为false否则为true
bool st[N];

void get_primes(int n)
{
for(int i = 2; i <= n; i++)
{
if(!st[i]) primes[cnt++] = i;
//假设primes[0]为n最小的质因子,i为最大的因数,
//易知若primes[i]中i>0,则会进入循环后产生多余的标记。
for(int j = 0; primes[j] <= n / i; j ++)
{
//标记;primes[j]一定是primes[j]*i的最小质因子
st[primes[j]*i] = true;
//表明primes[j]一定是i的最小质因子,没有必要再遍历,primes要小于等于i的最小质因子
//这样能保证每个数遍历一遍,而没有重复
if(i % primes[j] == 0) break;
}
}
}

int main()
{
int n;
cin >> n;
get_primes(n);
cout << cnt << endl;
return 0;
}

7-4 最大公约数和最小公倍数

分数 10

作者 李体新

单位 保定学院

本题目要求读入2个正整数A和B,输出它们的最大公约数和最小公倍数。

输入格式:

输入在一行中给出2个绝对值不超过1000的整数A和B。

输出格式:

在一行中输出A和B的最大公约数和最小公倍数。

输入样例:

1
16 24

输出样例:

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

int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}


int main() {
int a,b;
cin >> a >> b;
cout << gcd(a,b) << ' ' << a * b / gcd(a,b)<< endl;
return 0;
}

7-5 欧拉函数

分数 10

作者 杜祥军

单位 青岛大学

1∼N 中与 N 互质的数的个数被称为欧拉函数,记为ϕ(N)。
若在算数基本定理中,N=p^a1p^a2…pa^m,则:
ϕ(N) = N×(p1−1)/p1×(p2−1)/p2×…×(pm−1)/pm;

输入格式:

第一行输入一个n,接下来行每行包含一个正整数ai,输出ai的欧拉函数。
数据范围:1<=n<=100,1<=ai<=2*10^9

输出格式:

共一行,包含一个整数,表示 1∼n 中每个数的欧拉函数之和。

输入样例:

1
2
3
4
3
3
6
8

输出样例:

1
2
3
2
2
4
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
#pragma GCC optimize(2)
#include <algorithm>
#include <cstring>
#include <iostream>

using namespace std;

int phi(int x) {
int res = x;
for (int i = 2; i <= x / i; i++)
if (x % i == 0) {
res = res / i * (i - 1);
while (x % i == 0) x /= i;
}
if (x > 1) res = res / x * (x - 1);

return res;
}

int main() {
int n;
cin >> n;
int x;
while (n--) {
cin >> x;
cout << phi(x) << endl;
}

return 0;
}

7-6 求欧拉函数之和

分数 15

全屏浏览题目

切换布局

作者 aa

单位 江西财经大学

给定一个正整数 n,求 1∼n 中每个数的欧拉函数之和。

输入格式:

共一行,包含一个整数 n。

输出格式:

共一行,包含一个整数,表示 1∼n 中每个数的欧拉函数之和。

数据范围:

1≤n≤10^6

输入样例:

在这里给出一组输入。例如:

1
6

输出样例:

在这里给出相应的输出。例如:

1
12
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
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;

typedef long long LL;

const int N = 1e6 + 10;
int primes[N], cnt; // primes数组存所有的质因子,cnt是下标
int phi[N]; //欧拉函数
bool st[N]; //表示每个数是否被筛掉了

LL get_eulers(int n) {
phi[1] = 1;
for (int i = 2; i <= n; i++) { //线性筛
if (!st[i]) { //当前没有被筛过就是质数
primes[cnt++] = i;
phi[i] = i - 1;
}
for (int j = 0; primes[j] <= n / i; j++) {
st[primes[j] * i] = true;
if (i % primes[j] == 0) {
phi[primes[j] * i] = phi[i] * primes[j];
break;
}
phi[primes[j] * i] = phi[i] * (primes[j] - 1);
}
}
LL res = 0;
for (int i = 1; i <= n; i++) res += phi[i];
return res;
}

int main() {
int n;
cin >> n;
cout << get_eulers(n) << endl;
return 0;
}

7-7 小计算器

分数 20

作者 aa

单位 江西财经大学

模拟程序型计算器,依次输入指令,可能包含的指令有
  1. 数字:‘NUM X’,X为一个只包含大写字母和数字的字符串,表示一个当前进制的数
  2. 运算指令:‘ADD’,‘SUB’,‘MUL’,‘DIV’,‘MOD’,分别表示加减乘,除法取商,除法取余
  3. 进制转换指令:‘CHANGE K’,将当前进制转换为K进制(2≤K≤36)
  4. 输出指令:‘EQUAL’,以当前进制输出结果
  5. 重置指令:‘CLEAR’,清除当前数字
  指令按照以下规则给出:
  数字,运算指令不会连续给出,进制转换指令,输出指令,重置指令有可能连续给出
  运算指令后出现的第一个数字,表示参与运算的数字。且在该运算指令和该数字中间不会出现运算指令和输出指令
  重置指令后出现的第一个数字,表示基础值。且在重置指令和第一个数字中间不会出现运算指令和输出指令
  进制转换指令可能出现在任何地方
  运算过程中中间变量均为非负整数,且小于2^63。
  以大写的’A’‘Z’表示1035

输入格式:

第1行:1个n,表示指令数量
  第2…n+1行:每行给出一条指令。指令序列一定以’CLEAR’作为开始,并且满足指令规则
输出格式
  依次给出每一次’EQUAL’得到的结果

输出格式:

依次给出每一次’EQUAL’得到的结果

输入样例:

1
2
3
4
5
6
7
8
7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL

输出样例:

1
2040
1
蓝桥杯国赛题,下次一定写...

题目集链接,非本校同学可能打不开 https://pintia.cn/problem-sets/1546142650662113280/submissions

7-1 写出这个数

分数 10

作者 xxxtentx

单位 江西财经大学

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

在这里给出一组输入。例如:

1
1234567890987654321123456789

输出样例:

在这里给出相应的输出。例如:

1
yi san wu

没什么难度

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
46
47
48
49
50
51
52
53
54
55
#include <algorithm>
#include <cstring>
#include <iostream>
#include <stack>
using namespace std;

int main() {
string n;
getline(cin, n);
int cnt = 0;
for (int i = 0; i < n.size(); i++) cnt += (n[i] - '0');
stack<string> st;
while (cnt) {
switch (cnt % 10) {
case 0:
st.push("ling");
break;
case 1:
st.push("yi");
break;
case 2:
st.push("er");
break;
case 3:
st.push("san");
break;
case 4:
st.push("si");
break;
case 5:
st.push("wu");
break;
case 6:
st.push("liu");
break;
case 7:
st.push("qi");
break;
case 8:
st.push("ba");
break;
case 9:
st.push("jiu");
break;
}
cnt /= 10;
}
cout << st.top();
st.pop();
while (!st.empty()) {
cout << " " << st.top();
st.pop();
}
return 0;
}

7-2 成绩排名

分数 25

作者 江太白

单位 江西财经大学

读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

输入格式:

每个测试输入包含 1 个测试用例,格式为

第 1 行:正整数 n

第 2 行:第 1 个学生的姓名 学号 成绩

第 3 行:第 2 个学生的姓名 学号 成绩

… … …

第 n+1 行:第 n 个学生的姓名 学号 成绩

其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。

输出格式:

对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。

输入样例:

1
2
3
4
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95

输出样例:

1
2
Mike CS991301
Joe Math990112

复习一下结构体存储数据和sort函数的用法。

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
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;

typedef struct st {
string name, id;
int score;
} st;

bool stu_sort(st a, st b) { return a.score > b.score; }

int main() {
int n;
st stu[10010];
cin >> n;
for (int i = 0; i < n; i++) {
cin >> stu[i].name >> stu[i].id >> stu[i].score;
}
sort(stu, stu + n, stu_sort);
cout << stu[0].name << ' ' << stu[0].id << endl;
cout << stu[n - 1].name << ' ' << stu[n - 1].id;

return 0;
}

7-3 日期类

分数 20
作者 xxxtentx

单位 江西财经大学

编写一个日期类,要求按 xxxx-xx-xx 的格式输出日期,实现加一天的操作。

输入格式:

第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含 3 个用空格隔开的整数,分别表示年月日。

输出格式:

每组数据输出一行,一个结果,按 xxxx-xx-xx 的格式输出,表示输入日期的后一天的日期。

数据范围:

输入日期保证合法且不会出现闰年
年份范围 [1000,3000]

输入样例:

在这里给出一组输入。例如:

1
2
3
2
1999 10 20
2001 1 31

输出样例:

在这里给出相应的输出。例如:

1
2
1999-10-21
2001-02-01

日期类问题一直是模拟题中的难点,可以参考 https://www.acwing.com/blog/content/5918/ 来进行学习

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
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int T;
int months[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 得到某年某月的天数
int get(int year, int month) {
if (month != 2)
return months[month];
else {
// 2月
int leap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
return 28 + leap;
}
}

void next_date(int year, int month, int date) {
if (date == get(year, month)) {
if (month == 12) {
year++;
month = 1;
} else {
month++;
}
date = 1;
} else {
date++;
}
printf("%04d-%02d-%02d\n", year, month, date);
}

int main() {
cin >> T;
while (T--) {
int year, month, date;
cin >> year >> month >> date;
next_date(year, month, date);
}
return 0;
}

7-4 日期之差

分数 25

作者 江太白

单位 江西财经大学

给定两个日期,请你计算这两个日期之间有少天(定义连续的日期之差为2天)

输入格式:

共两行,每一行输入一个日期,日期格式为yyyy-MM-dd

输出格式:

一个正整数,为两个日期之间的差

输入样例:

1
2
2021-07-02
2021-07-15

输出样例:

1
14
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int T;
int months[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 是否是闰年
bool leap(int year) {
return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}
// 得到某年某月的天数
int get(int year, int month) {
if (month != 2)
return months[month];
else {
// 2月
return 28 + leap(year);
}
}

int main() {
int year1, month1, date1;
int year2, month2, date2;
scanf("%d-%d-%d", &year1, &month1, &date1);
scanf("%d-%d-%d", &year2, &month2, &date2);

if (year1 == year2) {
if (month1 == month2) {
cout << abs(date2 - date1) + 1;
return 0;
} else if (month1 < month2) {
int ans = 0;
ans += get(year1, month1) - date1;
for (int i = month1 + 1; i < month2; i++) ans += get(year1, i);
ans += date2;
cout << ans + 1<< endl;
return 0;
} else if (month1 > month2) {
int ans = 0;
ans += get(year1, month2) - date2;
for (int i = month2 + 1; i < month1; i++) ans += get(year1, i);
ans += date1;
cout << ans + 1<< endl;
return 0;
}
} else if (year1 < year2) {
int ans = 0;
ans += get(year1, month1) - date1;
for (int i = month1 + 1; i <= 12; i++) ans += get(year1, i);
for (int i = year1 + 1; i < year2; i++) ans += 365 + leap(i);
for (int i = 1; i < month2; i++) ans += get(year2, i);
ans += date2;
cout << ans + 1 << endl;
} else if (year1 > year2) {
int ans = 0;
ans += get(year2, month2) - date2;
for (int i = month2 + 1; i <= 12; i++) ans += get(year2, i);
for (int i = year2 + 1; i < year1; i++) ans += 365 + leap(i);
for (int i = 1; i < month1; i++) ans += get(year1, i);
ans += date1;
cout << ans + 1 << endl;
return 0;
}
return 0;
}

7-5 数字的菱形

分数 20

作者 xxxtentx

单位 江西财经大学

打印一个由数字 0∼n 构成的菱形。

其中 n 位于正中心,数字靠近边缘时逐个递减,直至为 0。

例如,当 n=5 时,图形如下所示:

1
2
3
4
5
6
7
8
9
10
11
          0
0 1 0
0 1 2 1 0
0 1 2 3 2 1 0
0 1 2 3 4 3 2 1 0
0 1 2 3 4 5 4 3 2 1 0
0 1 2 3 4 3 2 1 0
0 1 2 3 2 1 0
0 1 2 1 0
0 1 0
0

现在,给定 n,请你打印相应菱形。

输入格式:

一个整数 n。

输出格式:

输出相应菱形。

数据范围:

2 ≤ n ≤ 9

输入样例:

在这里给出一组输入。例如:

1
2

输出样例:

在这里给出相应的输出(注意每一个数字后面都有一个空格)。例如:

1
2
3
4
5
    0     
0 1 0
0 1 2 1 0
0 1 0
0

tips:第一行的0前面有4个空格,后面有5个空格

找规律的题目,规律与哈密顿距离有关(平面距离某一点的距离,就是那两个abs)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int g[11][11];
int main() {
int n;
cin >> n;
for (int i = 0; i < 2 * n + 1; i++) {
for (int j = 0; j < 2 * n + 1; j++) {
int t = n - abs(i - n) - abs(j - n);
if (t < 0)
printf(" ");
else
printf("%d ", t);
}
puts("");
}

return 0;
}

还不解封,人要疯。
Dfs 暴力枚举每一位,似乎没什么好办法,具体看注释吧。

Poj 2034

Description

Given a sequence of consecutive integers n,n+1,n+2,…,m, an anti-prime sequence is a rearrangement of these integers so that each adjacent pair of integers sums to a composite (non-prime) number. For example, if n = 1 and m = 10, one such anti-prime sequence is 1,3,5,4,2,6,9,7,8,10. This is also the lexicographically first such sequence.
给定一个连续的整数序列n,n+1,n+2,…,m,反素数序列是这些整数的重新排列,使得每个相邻的整数对和为一个合成(非素数)数。例如,如果n=1,m=10,则一个这样的反素数序列是1,3,5,4,2,6,9,7,8,10。这也是字典顺序上第一个这样的序列。
We can extend the definition by defining a degree danti-prime sequence as one where all consecutive subsequences of length 2,3,…,d sum to a composite number. The sequence above is a degree 2 anti-prime sequence, but not a degree 3, since the subsequence 5, 4, 2 sums to 11. The lexicographically .rst degree 3 anti-prime sequence for these numbers is 1,3,5,4,6,2,10,8,7,9.
我们可以通过定义阶反素数序列来扩展该定义,其中长度为2,3,…,d的所有连续子序列和为一个合成数。上述序列是2次反素数序列,但不是3次反素数序列,因为子序列5、4、2之和为11。这些数的第一个3次反素数序列的词典顺序是1,3,5,4,6,2,10,8,7,9。

INPUT

Input will consist of multiple input sets. Each set will consist of three integers, n, m, and d on a single line. The values of n, m and d will satisfy 1 <= n < m <= 1000, and 2 <= d <= 10. The line 0 0 0 will indicate end of input and should not be processed.
输入将由多个输入集组成。每组由三个整数组成,n、m和d,放在一行。n、m和d的值将满足1 <= n < m <= 1000,和2 <= d <= 10。0 0 0将表示输入结束,不应该被处理。

Output

For each input set, output a single line consisting of a comma-separated list of integers forming a degree danti-prime sequence (do not insert any spaces and do not split the output over multiple lines). In the case where more than one anti-prime sequence exists, print the lexicographically first one (i.e., output the one with the lowest first value; in case of a tie, the lowest second value, etc.). In the case where no anti-prime sequence exists, output
No anti-prime sequence exists.
对于每个输入集,输出一个由逗号分隔的整数列表组成的单行,形成一个度数的反素数序列(不要插入任何空格,不要将输出分成多行)。在存在多个反素数序列的情况下,打印按字母顺序排列的第一个序列(即输出第一个数值最低的序列;在出现并列的情况下,输出第二个数值最低的序列,等等)。在不存在反素数序列的情况下,输出
不存在反素数序列。

Sample Input

1
2
3
4
5
1 10 2
1 10 3
1 10 5
40 60 7
0 0 0

Sample Output

1
2
3
4
1,3,5,4,2,6,9,7,8,10
1,3,5,4,6,2,10,8,7,9
No anti-prime sequence exists.
40,41,43,42,44,46,45,47,48,50,55,53,52,60,56,49,51,59,58,57,54

代码

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
using namespace std;

const int N = 10000 + 10;

int n, m, k;
int a[N];
bool vis[N];

int primes[N], cnt;
bool st[N];

// 线性筛筛素数
void get_primes() {
for (int i = 2; i <= N; i++) {
if (!st[i]) primes[cnt++] = i;
for (int j = 0; primes[j] <= N / i; j++) {
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
// 判断第 x 位上放 y 这个数字后是否还是反素数序列
bool check(int x, int y) {
// 如果是第一位,那么不测
if (x == 0) return true;
// 只需检测前 k 个数的合
int sum = y;
for (int i = x - 1; x - i < k && i > 0; i--) {
sum += a[i];
// 只要在阶数范围内,有一个连续的合是素数就不是反素数序列
if (!st[sum]) return false;
}
return true;
}

// x 表示当前判断到第几位
bool dfs(int x) {
// 如果最后一位,则返回true
if (x == n - m + 1) return true;
// 如果没用过这个数字且放进去是反素数序列
for (int i = m; i <= n; i++) {
if (!vis[i] && check(x, i)) {
a[x] = i;
vis[i] = true;
if (dfs(x + 1)) return true;

vis[i] = false;
}
}
return false;
}

int main() {
get_primes();
while (scanf("%d%d%d", &m, &n, &k) && (m + n + k)) {
memset(vis, 0, sizeof(vis));
if (dfs(0)) {
for (int i = 0; i < n - m; i++) printf("%d,", a[i]);
printf("%d\n", a[n - m]);
} else {
printf("No anti-prime sequence exists.\n");
}
}
return 0;
}

参考链接,大概看了下似乎确实没有非暴力法:
1.CSDN
2.luogu

521,冤种还在写题🥹
又闻线下上课,但大学牲仍禁止出校,悲伤超级加倍

大概思路是:
先用户输入的中缀表达式先预处理转换成后缀表达式,再用二进制枚举的方法枚举出真值表的每一条。
对于真值的每一条:用每个变量的具体的真值情况(0或1)来替换预处理过后缀表达式中具体的变量,最后再计算输出后缀表达式的真值。

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <cstring>
#include <iostream>
#include <map>
#include <stack>
#include <vector>
using namespace std;
// 优先级
map<char, int> prior = {{'!', 5}, {'&', 4}, {'|', 3}};
// 是否为运算操作符
bool isOperator(char op) {
if (op == '|' || op == '&' || op == '!') return true;
return false;
}
// 中缀转后缀
string getPostfix(string infix) {
// 一个栈存储运算符
stack<char> s;
// 存储后缀表达式
string postfix;
for (int i = 0; i < infix.size(); i++) {
char tmp = infix[i];
if (isOperator(tmp)) {
while (!s.empty() && isOperator(s.top()) &&
prior[s.top()] >= prior[tmp]) {
postfix.push_back(s.top());
s.pop();
}
s.push(tmp);
} else if (tmp == '(') {
s.push(tmp);
} else if (tmp == ')') {
while (s.top() != '(') {
postfix.push_back(s.top());
s.pop();
}
s.pop();
} else if (isalpha(tmp))
postfix.push_back(tmp);
}
while (!s.empty()) {
postfix.push_back(s.top());
s.pop();
}
return postfix;
}
// 计算后缀表达式
bool Caculate(string postfix) {
// 栈存储真值
stack<int> s;
bool left, right;
bool flag;
// 从左到右遍历后缀表达式
for (int i = 0; i < postfix.size(); i++) {
char c = postfix[i];
// 如果是真值
if (c == '0' || c == '1') {
s.push(c - '0');
continue;
// 对 ! 特判,是为了简化代码
} else if (c == '!') {
flag = s.top();
s.pop();
s.push(!flag);
continue;
}
// 对 | 和 & 的判断
right = s.top();
s.pop();
left = s.top();
s.pop();
if (c == '|') {
s.push(left | right);
continue;
} else if (c == '&') {
s.push(left & right);
continue;
}
}
return s.top();
}

//真值表输出
void Print(string infix) {
// 生成后缀表达式 postfix
string postfix = getPostfix(infix);
// 存储命题变量
vector<char> v;
for (int i = 0; i < postfix.size(); i++)
if (isalpha(postfix[i])) v.push_back(postfix[i]);
// 删除重复的命题变量,此时 v 中存储的是命题变量的集合
// v.size()为命题变量的个数
v.erase(unique(v.begin(), v.end()), v.end());

// 输出最上面一行
// 先输出变量
for (int i = 0; i < v.size(); i++) printf("%5c", v[i]);
// 再输出中缀式,
printf(" %s\n", infix.c_str());

// 变量有几个,就有 2^n 个表达式
// 比如有 2 个变量,它的真值情况就是 00, 01, 10, 11 四种情况
// 转换为十进制就是 0 1 2 3
// 此时每一个变量的真值情况可以表示为一个二进制位
for (int i = 0; i < (1 << v.size()); i++) {
// 将后缀式赋给临时字符串,用于计算
string tmp = postfix;
// 输出这一个的变量表达式
for (int k = 0; k < v.size(); k++) printf("%5d", 1 & (i >> k));
int j = 0;
// 将临时字符串中的变量替换为对应的值
while (j < tmp.size()) {
if (isalpha(tmp[j])) {
// 先找到位置
int index = find(v.begin(), v.end(), tmp[j]) - v.begin();
// 再找到对应的真值
tmp[j] = (char)((int)(1 & (i >> index)) + '0');
}
j++;
}
// 最后输出它的真值
printf("%5d\n", Caculate(tmp));
}
return;
}

int main() {
string infix;
printf("请您输入合法表达式(&表示合取,|表示析取,!表示非)\n");
while (cin >> infix) {
Print(infix);
printf("请您输入合法表达式(&表示合取,|表示析取,!表示非)\n");
}
return 0;
}

这是暑假的大作业(为了提前放假,把暑假后所谓“小学期”的课放在期末考试前的周末上!!!还是从早上八点上到下午五点!!!很生气,所以做的也比较粗糙。

使用方法:
1.安装 VisualStdioCommunity
2.安装 EasyX,下载后,将其安装到 VS2022 中。
3.在 VS2022 中新建一个项目,把下面代码复制进去,就可以跑啦!

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <conio.h>
#include <graphics.h>
#include <windows.h>

// save maze
// 0 --> barrier
// 1 --> access
bool maze[8][8] = { 1, 1, 1, 0, 1, 1, 0, 1,
1, 1, 1, 0, 0, 1, 1, 1,
1, 0, 1, 1, 1, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 1, 1, 1, 1, 0, 1,
1, 1, 1, 0, 1, 1, 1, 1,
1, 0, 1, 1, 1, 0, 1, 1,
1, 1, 0, 1, 0, 1, 1, 1 };

void drawTable() {
// setup tangle border
// leftop(50.50) rightbottom(450,450)
rectangle(50, 50, 450, 450);
// draw table
for (int i = 1; i < 9; i++) line(50, 50 * (i + 1), 450, 50 * (i + 1));
for (int i = 1; i < 9; i++) line(50 * (i + 1), 50, 50 * (i + 1), 450);
}

void drawStartAndEnd() {
// add description
RECT s = { 0, 0, 150, 80 };
drawtext(_T("Start"), &s, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
// set start == left top
solidrectangle(50, 50, 100, 100);
// add description
RECT e = { 0, 0, 850, 920 };
drawtext(_T("End"), &e, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
// set end
solidrectangle(400, 400, 450, 450);
}

void drawBarrier() {
setfillcolor(RED);
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++) {
if (!maze[i][j]) {
solidrectangle(50 * (j + 1), 50 * (i + 1), 50 * (j + 2),
50 * (i + 2));
Sleep(30);
}
}
}

bool visited[8][8];
int dx[4] = { 0, 1, 0, -1 }, dy[4] = { 1, 0, -1, 0 };
void dfs(int sx, int sy) {
if (sx == 7 && sy == 7) {
// SUCCESS
RECT s = { 100, 100, 250, 250 };
drawtext(_T("YOU WIN!"), &s, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
Sleep(1000);
exit(0);
}

// visited and draw


for (int i = 0; i < 4; i++) {
int x = sx + dx[i], y = sy + dy[i];
// if out of maze or visited or barrier --> continue
if (x < 0 || x > 7 || y < 0 || y > 7) continue;
if (visited[x][y] || !maze[x][y]) continue;
// else next
visited[sx][sy] = true;
solidrectangle(50 * (sy + 1), 50 * (sx + 1), 50 * (sy + 2),
50 * (sx + 2));
Sleep(500);
dfs(x, y);

visited[sx][sy] = false;
clearrectangle(50 * (sy + 1), 50 * (sx + 1), 50 * (sy + 2),
50 * (sx + 2));
}
}

int main() {
// init graph 500 x 500
initgraph(500, 500);

drawTable();
drawStartAndEnd();
drawBarrier();

memset(visited, false, sizeof visited);
setfillcolor(GREEN);
dfs(0, 0);

_getch();
closegraph();
return 0;
}

其实跑起来是有bug的,visited由bool改为int,再在下方对visited=true改为++,再对每一个visited换一个颜色说不定就好了,不过我太懒了!

TL;DR

下载脚本 https://doge.mhatp.cn/iTest.bat 运行即可。杀毒软件可能会报错,请允许。

分析

学校的iTest域名nhce.jxufe.cn域名只在校内解析,使用非校内 dns 无法解析到这个地址,从而无法访问。我们只需要在C:\Windows\System32\drivers\etc\hosts中加入下面一行host即可,上述脚本也正是模拟了这个过程。
如果是你使用了代理软件,可能需要在代理软件内部加入host。

1
172.29.4.216 nhce.jxufe.cn
0%