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.永恒守候的爱恋