NBUACM2024

  • 第一场 AK 的比赛也是在此记录一下

https://ac.nowcoder.com/acm/contest/93790

A 构造序列

题目描述

给你个正数和个负数,请你使用这些数字,构造一个序列。
序列需要满足:正数不能和正数相邻,负数不能和负数相邻。
那么,最多能构造多长的序列?

输入描述

第一行输入两个整数)代表正数数量,负数数量

输出描述

在一行上输出一个整数,代表能构造的最长序列的长度

示例 1

输入

1
7 6

输出

1
13

Solution

没有什么特别的签到题,以为基准,计算序列长度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <bits/stdc++.h>
using namespace std;
int main() {
long long n, m;
cin >> n >> m;
if (n > m) {
swap(n, m);
}
if (m - n >= 1) {
cout << 2 * n + 1 << endl;
} else {
cout << 2 * n << endl;
}
return 0;
}

B 小红的好数

题目描述

小红定义一个正整数是“好数”,当且仅当该数满足以下两个性质:

  1. 数位恰好为
  2. 个位数和十位数相同。
    请你判断一个给定的正整数是否是好数?

输入描述

一个正整数

输出描述

是好数,请输出"Yes"。否则输出"No"。

示例 1

输入

1
33

输出

1
Yes

示例 2

输入

1
144

输出

1
No

Solution

翻译题目即可

1
2
3
4
5
6
7
8
9
10
11
12
#include <bits/stdc++.h>
using namespace std;
int main() {
int x;
cin >> x;
if (11 <= x && x <= 99 && x / 10 == x % 10) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}

C [NOIP2013]记数问题

题目描述

试计算在区间 1 到 n 的所有整数中,数字 x()共出现了多少次?
例如,在 1 到 11 中,即在 中,数字 1 出现了 4 次。

输入描述

输入共 1 行,包含 2 个整数,之间用一个空格隔开。

输出描述

输出共 1 行,包含一个整数,表示 出现的次数。

示例 1

输入

1
11 1

输出

1
4

备注:

对于 100%的数据,,

Solution

翻译题目即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <bits/stdc++.h>
using namespace std;
int main() {
long long cnt = 0;
int n, x, t;
cin >> n >> x;
for (int i = 1; i <= n; i++) {
t = i;
while (t) {
if (t % 10 == x) cnt++;
t /= 10;
}
}
cout << cnt << endl;
return 0;
}

D 统计数据正负个数

题目描述

输入 10 个整数,分别统计输出正数,负数的个数。

输入描述

输入 10 个整数(范围),用空格分隔。

输出描述

两行,第一行正数个数,第二行负数个数,具体格式见样例。

示例 1

输入

1
-1 2 3 -6 7 8 -1 6 8 10

输出

1
2
positive:7
negative:3

Solution

翻译题目即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <bits/stdc++.h>
using namespace std;
int main() {
int pos = 0, neg = 0, n = 10;
long long x;
while (n--) {
cin >> x;
if (x < 0) {
neg++;
} else if (x > 0) {
pos++;
}
}
cout << "positive:" << pos << endl;
cout << "negative:" << neg << endl;
return 0;
}

E 默契

题目描述

经过无数次 Wa~~以后,小财终于理解了二分查找,终于可以出去玩了。
正好这时小金来找他玩猜数字的游戏,
每个人随即说出一个数字,若两数字相等输出“Tacit!”(不包括引号),否则输出“No Tacit!”(不包括引号)。

输入描述

两个整数 x 和 y(在 int 范围内),分别代表小金和小财说出的数字。

输出描述

一行,按照题目表示这两个数字的关系。

示例 1

输入

1
1 10

输出

1
No Tacit!

示例 2

输入

1
0 0

输出

1
Tacit!

Solution

坑爹题目,Tacit!这里的感叹号是全角 :(

1
2
3
4
5
6
7
8
9
10
11
12
#include <bits/stdc++.h>
using namespace std;
int main() {
int x, y;
cin >> x >> y;
if (x == y) {
cout << "Tacit!" << endl;
} else {
cout << "No Tacit!" << endl;
}
return 0;
}

F [NOIP2005]校门外的树

题目描述

某校大门外长度为 的马路上有一排树,每两棵相邻的树之间的间隔都是 米。我们可以把马路看成一个数轴,马路的一端在数轴 的位置,另一端在 的位置;数轴上的每个整数点,即 ,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入描述

第一行有两个整数:)和 ), 代表马路的长度, 代表区域的数目, 之间用一个空格隔开。接下来的 行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

输出描述

包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

示例 1

输入

1
2
3
4
500 3
150 300
100 200
470 471

输出

1
298

备注

对于 20%的数据,区域之间没有重合的部分;
对于其它的数据,区域之间有重合的情况。

Solution

没什么好的思路,用一个数组记录该点处的树是否存在,最后求和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <bits/stdc++.h>
using namespace std;
int main() {
int L, M, l, r, cnt = 0;
cin >> L >> M;
vector<int> trees(L + 1, 1);
while (M--) {
cin >> l >> r;
for (int i = l; i <= r; i++) {
trees[i] = 0;
}
}
for (auto i : trees) {
cnt += i;
}
cout << cnt << endl;
return 0;
}

G [NOIP2010]数字统计

题目描述

请统计某个给定范围的所有整数中,数字 出现的次数。
比如给定范围,数字 在数 中出现了 次,在数 中出现 次,在数 中出现 次,在数 中出现 次,在数 中出现 次,所以数字 在该范围内一共出现了 次。

输入描述

输入共 行,为两个正整数 ,之间用一个空格隔开。

输出描述

输出共 行,表示数字 出现的次数。

示例 1

输入

1
2 22

输出

1
6

示例 2

输入

1
2 100

输出

1
20

备注

Solution

直接翻译题目就行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <bits/stdc++.h>
using namespace std;
int main() {
long long cnt = 0;
int l, r, x = 2, t;
cin >> l >> r;
for (int i = l; i <= r; i++) {
t = i;
while (t) {
if (t % 10 == x) cnt++;
t /= 10;
}
}
cout << cnt << endl;
return 0;
}

H 小名的回答

题目描述

总算到暑假了,小姐姐是非常的闲,所以想去找梅溪湖的小名玩,可是她从没去过梅溪湖,所以只能凭小名告诉她的地方走,每次只能向上下左右四个方向走 步。小姐姐的坐标为,小名在,小姐姐有点近视,小名也有点近视。所以到了也不一定能和小名会面,不过还好,小姐姐最后找到了小名。小姐姐想要小名知道自己来一趟是多么不容易,所以在聊天的过程中小姐姐说自己为了到这里走了 步。小名,你觉得她说的可能是真话么。有可能就输出 YES,否则输出 NO(如果用 random 的话,小姐姐觉得你好像不在意她,明年暑假就不来了)

输入描述

a,b,n(, , )

输出描述

"YES" or "NO"

示例 1

输入

1
2 2 4

输出

1
YES

示例 2

输入

1
1 9 2

输出

1
NO

Solution

可知最小步数应为,而要能经过 步到达(a,b),则应当为偶数

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, n, d;
cin >> a >> b >> n;
d = abs(a) + abs(b);
if (d == n || (d < n && (n - d) % 2 == 0)) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
return 0;
}

I 整数个数

题目描述

给定 k(k 大于 1 且小于 50)个正整数,其中每个数都是大于等于 1,小于等于 10 的数。写程序计算给定的 k 个正整数中,1,5 和 10 出现的次数。

输入描述

输入数据只有一组,第一行包含一个正整数 k(k 大于 1 且小于 100),第二行包含 k 个正整数,每两个正整数用一个空格分开。

输出描述

输出有三个数,第一个数为 1 出现的次数,第二个数为 5 出现的次数,第三个数为 10 出现的次数且后面没有多于的空格,每个数间用一个空格隔开,每两组数据间用一空行分开。

示例 1

输入

1
2
5
1 5 8 10 5

输出

1
1 2 1

Solution

直接翻译题目

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <bits/stdc++.h>
using namespace std;
int main() {
int k, x;
cin >> k;
map<int, int> m;
while (k--) {
cin >> x;
m[x]++;
}
cout << m[1] << " " << m[5] << " " << m[10] << endl;
return 0;
}

J 矩阵转置

题目描述

KiKi 有一个矩阵,他想知道转置后的矩阵(将矩阵的行列互换得到的新矩阵称为转置矩阵),请编程帮他解答。

输入描述

第一行包含两个整数 n 和 m,表示一个矩阵包含 n 行 m 列,用空格分隔。 (,)
行,每行输入 m 个整数(范围),用空格分隔,共输入个数,表示第一个矩阵中的元素。

输出描述

输出 m 行 n 列,为矩阵转置后的结果。每个数后面有一个空格。

示例 1

输入

2 3
1 2 3
4 5 6

输出

1 4
2 5
3 6

Solution

直接翻译题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <bits/stdc++.h>
using namespace std;
int main() {
int mat[10][10];
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) cin >> mat[i][j];
for (int j = 0; j < m; j++) {
for (int i = 0; i < n; i++) cout << mat[i][j] << " ";
cout << endl;
}
return 0;
}

K 得不到的爱情

题目描述

Chranos 是个数学天才。
一天,有一个可爱的小女孩追求 Chranos,他知道 Chranos 最喜欢当且仅当总质量为 K 克的时候的番茄炒蛋了。她希望通过美食俘获 Chranos 的胃,这样就一定可以和他在一起了吧!虽然小女孩有无限数量的食材,但是数学王国的番茄和蛋非常特殊,他们的质量分别为 N 克和 M 克。为了表现一颗完整的心,表达充足的爱意,所有的食材必须被用完。N 和 M 都是正整数且互素,制作过程中既不会凭空增加质量,也不会凭空消失质量。
Chranos 不希望小女孩打扰他学数学。他发现,并不是所有番茄炒蛋都是可以被制作出来的。他想找出最大的不可以被制作出的总质量 K 来拒绝小女孩,这样 Chranos 就可以永远和数学在一起了!

输入描述

第一行为正整数NM()。

输出描述

输出最大的不可以被制作出的总质量 K。

示例 1

输入

1
2 3

输出

1
1

Solution

用到了塞瓦维斯特定理

对于式子,当均大于互为素数(),满足方程无整数解的 c 的最大值为

1
2
3
4
5
6
7
8
#include <bits/stdc++.h>
using namespace std;
int main() {
long long n, m;
cin >> n >> m;
cout << n * m - n - m << endl;
return 0;
}

L 兔子的序列

题目描述

兔子发现了一个数字序列,于是开始研究这个序列。兔子觉得一个序列应该需要有一个命名,命名应该要与这个序列有关。由于兔子十分讨厌完全平方数,所以兔子开创了一个新的命名方式:这个序列中最大的不是完全平方数的数字就是他的名字。
现在兔子有一个序列,想要知道这个序列的名字是什么。

输入描述

第一行一个整数 ,表示序列的长度。
第二行有 个整数 ,表示序列中的 个数分别是多少。

输出描述

输出仅一行,表示这个序列的名字,也就是这个序列中最大的非完全平方数。

示例 1

输入

1
2
2
4 2

输出

1
2

示例 1

输入

1
2
8
1 576 2 8 32 64 4 16

输出

1
32

备注

对于 50%的数据:
对于 100%的数据: ,
数据保证至少有一个非完全平方数

Solution

直接翻译题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, a, t;
cin >> n;
vector<int> li;
while (n--) {
cin >> a;
li.push_back(a);
}
sort(li.begin(), li.end());
for (auto i = li.size() - 1; i >= 0; i--) {
t = sqrt(li[i]);
if (t * t != li[i]) {
cout << li[i] << endl;
break;
}
}
return 0;
}

M 序列中整数去重

题目描述

输入 n 个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的整数,只保留该数第一次出现的位置,删除其余位置。

输入描述

输入包含两行,第一行包含一个正整数),表示第二行序列中数字的个数;第二行包含个整数(范围),用空格分隔。

输出描述

输出为一行,按照输入的顺序输出去重之后的数字,用空格分隔。

示例 1

输入

1
2
5
10 12 93 12 75

输出

1
10 12 93 75

Solution

直接 map 记录是否存在就行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> li;
map<int, int> m;
int n, x;
cin >> n;
while (n--) {
cin >> x;
if (m[x] == 0) {
li.push_back(x);
m[x]++;
}
}
for (auto i : li) {
cout << i << " ";
}
cout << endl;
return 0;
}

N 有序序列插入一个整数

题目描述

有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。

输入描述

第一行输入一个整数()。
第二行输入个升序排列的整数,输入用空格分隔的 N 个整数。
第三行输入想要进行插入的一个整数。

输出描述

输出为一行,个有序排列的整数。

示例 1

输入

1
2
5
10 12 93 12 75

输出

1
10 12 93 75

Solution

理论上是插入排序,实际上是 STL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> li;
int n,x;
cin >> n;
n++;
while(n--){
cin >> x;
li.push_back(x);
}
sort(li.begin(),li.end());
for (auto i : li) {
cout << i << " ";
}
cout << endl;
return 0;
}

O 前天是哪天

题目描述

给定公元 2000 年到公元 3000 年之间的某一天,请你给出该天的前天是哪一天.

输入描述

输入在一个日期,格式如"yyyy-mm-dd",题目保证所有输入日期为合法日期。

输出描述

在一行中输出日期,格式如"yyyy-mm-dd"。

示例 1

输入

1
2020-11-15

输出

1
2020-11-13

备注

注意日期格式,月份或者天数不足 2 位要补零。

Solution

一个是补零,另一个是判断前天是否为去年,以及闰年时二月天数

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
#include <bits/stdc++.h>
using namespace std;
int main() {
int y, m, d;
int mp[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
string z = "0";
scanf("%d-%d-%d", &y, &m, &d);
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
mp[1]++;
}
if (d >= 3)
d -= 2;
else if (m != 1) {
m--;
d = mp[m - 1] + (d - 2);
} else {
y--;
m = 12;
d = mp[m - 1] + (d - 2);
}
cout << y << "-";
if (m < 10) cout << "0";
cout << m << "-";
if (d < 10) cout << "0";
cout << d << endl;
return 0;
}