0%

2023牛客寒假算法训练营3

A.不断减损的时间

题意:

给你一个数组,你可以选择一个偶数除以2,可以进行多次操作(也可以不操作),求数组所有元素之和的最小值。

数据范围

$$1 \leq n \leq 10^5 , -10^9 \leq a_i \leq 10^9$$

题解:模拟

直接操作就是了

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void JiuCherish(){
int n;
std::cin >> n;
i64 sum = 0;
for(int i=1;i<=n;i++) {
i64 x;
std::cin >> x;
while(!(x & 1) && (x > 0)) {
x /= 2;
}
sum += x;
}
std::cout << sum << endl;
}

B.勉强拼凑的记忆

题意:

给你 n 块矩形来构造正方形,可以自行选择积木大小,但是限定为 1*k 的长和宽,其中约定了 1 <= k <= ceil(n/2) ,其中ceil()函数表示取上界。问最大可以搭建多大的正方形,请输出其边长,如果无法构造成正方形,请输出 -1

数据范围:

t 表示询问次数。

$$1 \leq t \leq 200000, 1 \leq n \leq 10^{18}$$

题解:

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void JiuCherish(){
i64 n;
std::cin >> n;
if(n == 2) {
std::cout << -1 << endl;
return;
}
if(n & 1) {
std::cout << n / 2 + n / 6 + 1 << endl;
} else {
std::cout << n / 2 + n / 6 << endl;
}
}

C.忽远忽近的距离

题意:

构造一个长度为 n 的排列,并且对于所有a_i 满足下式:

$$2 \leq |a_i - i| \leq 3$$

排列:长度为n的数组,每个数字(1~n)只会出现一次

数据范围:

$$1 \leq n \leq 10^5$$

题解:构造、模拟

代码:

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
void JiuCherish(){
i64 n;
std::cin >> n;
if(n <= 3) {
std::cout << -1 << endl;
return;
}
if(n % 4 == 0) {
int a = 3,b = 4,c = 1,d = 2;
for(int i=1;i<=n / 4;i++) {
std::cout << a + (i - 1) * 4 << " " << b + (i - 1) * 4 << " " << c + (i - 1) * 4 << " " << d + (i - 1) * 4 << " ";
}
return;
} else if(n % 4 == 1) {
std::cout << 3 << " " << 4 << " " << 5 << " " << 1 << " " << 2 << " ";
if(n == 5) {
return;
} else{
int a = 8,b = 9,c = 6,d = 7;
for(int i=1;i<=(n - 4) / 4;i++) {
std::cout << a + (i - 1) * 4 << " " << b + (i - 1) * 4 << " " << c + (i - 1) * 4 << " " << d + (i - 1) * 4 << " ";
}
}
} else if(n % 4 == 2) {
std::cout << 3 << " " << 5 << " " << 1 << " " << 6 << " " << 2 << " " << 4 << " ";
if(n == 6) {
return;
}
int a = 9,b = 10,c = 7,d = 8;
for(int i=1;i<=(n - 6) / 4;i++) {
std::cout << a + (i - 1) * 4 << " " << b + (i - 1) * 4 << " " << c + (i - 1) * 4 << " " << d + (i - 1) * 4 << " ";
}
} else if(n % 4 == 3) {
if(n == 7) {
std::cout << -1 << endl;
return;
} else {
std::cout << "3 4 1 6 2 8 5 10 11 7 9" << " ";
int a = 14,b = 15,c = 12,d = 13;
for(int i=1;i<=(n - 11) / 4;i++) {
std::cout << a + (i - 1) * 4 << " " << b + (i - 1) * 4 << " " << c + (i - 1) * 4 << " " << d + (i - 1) * 4 << " ";
}
}
}
}

D.宿命之间的对决

题意:

A和B玩游戏,给定一个 n,A先手,每次取 n 的一个因子,使得 n 减去 x ,谁将n 减到 0 就算输。

问:A和B足够聪明的情况下,谁会获胜。

数据范围:

$$1 \leq n \leq 10^{18}$$

题解:博弈

代码:

1
2
3
4
5
6
void JiuCherish(){
i64 n;
std::cin >> n;
if(n & 1) std::cout << "yukari" << endl;
else std::cout << "kou" << endl;
}

E.公平守望的灯塔

题意:

在平面直角坐标系上,给定了两个点 A 和 B(保证两点不会重合),现在选择一个 C 点,满足三角形 ABC 是以 AB 为斜边的等腰直角三角形。

若找到,输出C点的坐标,有多解的情况下输出任意解即可。若找不到输出”No Answer!”

数据范围:

$$-10^9 \leq x_a,y_a,x_b,y_b \leq 10^9$$

题解:几何,模拟

代码:

此处的 i64 为 double类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
i64 getmid(i64 a,i64 b) {
return (a - b) / 2;
}
void JiuCherish(){
i64 xa,xb,ya,yb;
std::cin >> xa >> ya >> xb >> yb;
i64 midx = getmid(xa,xb);
i64 midy = getmid(ya,yb);
i64 nowxc = getmid(xa,-xb) - midy;
i64 nowyc = getmid(ya,-yb) + midx;
i64 x = abs(nowxc - (int)nowxc);
i64 y = abs(nowyc - (int)nowyc);
if(x < eps && y < eps) {
std::cout << (int)nowxc << " " << (int)nowyc << endl;
} else {
std::cout << "No Answer!" << endl;
}
}

F.迎接终结的寂灭

题意:

给你点屁话,让你输出宇宙最终答案:42。

代码:

1
2
3
void JiuCherish(){
std::cout << 42 << endl;
}

G.严肃古板的秩序

题意:

给你一个运算式,对于‘?’可以转换成’+’,’-‘,’#’(不能添加括号)。

对于’#’的定义为: a # b 为 a 的 a 次方 对 b取模。

例如:3 # 5

$$= 3 ^ 3 mod 5 = 27 mod 5 = 2$$

问最终式子能否成立,如果可以输出任意一个合法解,否则输出-1。

数据范围:

‘?’的数量不超过12个,所有阿拉伯数字为不超过1e9的非负整数。给定的运算式只会有阿拉伯数字、’?’ 和 ‘=’ 组成。

题解:dfs

代码:

H.穿越万年的轮回

I.灵魂碎片的收集

J.无法磨灭的悔恨

K.永恒守候的爱恋