#COCR CUP 题解
2025-09-07 08:25:15
发布于:浙江
非官方题解 | COCR Cup 2025 思路题解
COCR Cup比赛链接
本人先讲片面题目思路 我是蒟蒻 这里就只讲T1~T4
顺便参加一下“我师焉”
题目编号 | 题目名称 | 题目难度 |
---|---|---|
T1 | Easy | 入门 |
T2 | Word | 普及/提高- |
T3 | Force | 普及+/提高 |
T4 | Stone | 普及+/提高 |
T5 | Farm | 省选/NOI- |
T6 | Run | 省选/NOI- |
T7 | Zombie | NOI/NOI+/CTSC |
T8 | Square | NOI/NOI+/CTSC |
T1 Easy
题目大意
一个 且保留2位小数
题解思路
我们可以先求出
如果你不懂特殊角比例也没关系 我复制一份到右边就成为了一个等边三角形
实例代码
#include <iostream>
using namespace std;
int main() {
double n;
cin >> n;
printf("%.2lf",n*2);
return 0;
}
T2 Word
题目大意
这是一个模拟简化版Word编辑器的题目。你需要处理6种操作来维护一个文本字符串:
6种操作:
- I x - 在光标处插入字符x
- A - 全选整个文档
- C - 复制选中的内容到剪贴板
- V - 在光标处粘贴剪贴板内容
- P i - 移动光标到第i个字符后
- TP i - 选择第i个字符
关键状态:
- 文档内容:当前的文本字符串
- 光标位置:当前插入位置(0到文档长度)
- 剪贴板:临时存储复制的内容
- 选择状态:全选状态或选中单个字符状态
特殊规则:
- 全选后执行键入或粘贴会替换整个文档
- 双击选择字符后执行键入会替换该字符
- 位置超出时自动调整到边界
- 字符位置从1开始计数
下面我给出操作思路代码:
变量名意思
string s = ""; // 文档内容
string s2 = ""; // 剪贴板内容
int x = 0; // 光标位置
bool ia = false; // 是否全选
int id = -1; // 双击选择的字符位置
C操作
void C() {
if (ia) {
s2 = s;
} else if (id != -1) {
s2 = string(1, s[id]);
}
}
V操作
void V() {
if (s2.empty()) return;
if (ia) {
s = s2;
x = s.size();
ia = false;
id = -1;
} else if (id != -1) {
s.replace(id, 1, s2);
x = id + s2.size();
id = -1;
} else {
s.insert(x, s2);
x += s2.size();
}
}
P操作
void P(int pos) {
x = min(pos, (int)s.size());
ia = false;
id = -1;
}
TP操作
void TP(int pos) {
if (s.empty()) {
id = -1;
} else {
id = min(pos - 1, (int)s.size() - 1);
}
ia = false;
}
I操作
void I(char c) {
if (ia) {
s = string(1, c);
x = 1;
ia = false;
id = -1;
} else if (id != -1) {
s[id] = c;
x = id + 1;
id = -1;
} else {
s.insert(x, 1, c);
x++;
}
}
A操作
void A() {
ia = true;
id = -1;
}
T3 Force
题目大意
题目分析
力的合成计算公式
1. 力的分解公式
将每个力分解为水平方向(x轴)和垂直方向(y轴)的分量:
水平分力:
垂直分力:
其中:
- 为第 个力的大小
- 为第 个力的弧度值
2. 合力计算公式
总水平合力:
总垂直合力:
3. 合力大小公式
合力大小:
4. 合力方向公式
合力与水平面的夹角(弧度):
转换为角度:
5. 角度处理
角度规范化:
- 如果 ,则
- 最终结果向下取整:
6. 最终输出
输出两个整数:
- 合力大小 向下取整:
- 合力角度 向下取整:
注: 使用 atan2(y, x)
函数可以正确处理所有象限的角度计算。
这就是思路 由于作者没能写出来具体代码 其实在上课没时间写 我下次重新写一遍再给代码
T4 Stone
Nim游戏分析
题目分析
1. 游戏规则
- 有N堆石子,玩家轮流从任意一堆中取走任意数量的石子(至少取1个)
- 取走最后石子的人获胜
- FM是先手
2. 必胜条件(Bouton定理)
对于Nim游戏,先手必胜的充要条件是:所有堆石子数量的异或和不为0。
即:如果 ,则先手必胜(输出"Yes")
3. 必败情况的处理
如果异或和为0(即 ),则先手必败(输出"No")。
此时需要添加一堆数量为 的石子,使得新的异或和不为0:
4. 最小添加数量的计算
设当前异或和为
要使添加后异或和不为0,需要:
但题目要求的是最少个数,所以:
- 如果原始异或和 ,那么最小的 是 1
- 因为 ,且1是最小的正整数
5. 特殊情况考虑
为什么不能添加0个石子?
- 题目要求"添加一堆石子",所以数量必须 ≥1
- 即使允许添加0个,,仍然必败
说白了 我白说了 你看了这么多其实就是进行异或操作 就能判断多次异或的数字是否为0不是0就输出Yes反之输出No
代码解析:
#include <bits/stdc++.h>
using namespace std;
int t,sum=0;
int main() {
cin >> t;
while (t--) {
int N;
cin >> N;
vector<int> a(N);
for (int i = 0; i < N; i++) {
cin >> a[i];
sum ^= a[i];
}
if (sum != 0) {
cout << "Yes\n";
} else {
cout << "No 1\n";
}
}
return 0;
}
全部评论 16
T4盐都不言了 只改个n (N)
22小时前 来自 浙江
0?
20小时前 来自 上海
0
https://www.acgo.cn/discuss/study/56453 我发的题解,你看看可以吗?
昨天 来自 上海
0抄我的是不是有点过分了
22小时前 来自 浙江
0嗯
20小时前 来自 上海
0没抄啊
20小时前 来自 上海
0
%%%
昨天 来自 上海
01111111111111111111111111111111111111111111111@不会C++的noah!!!!
昨天 来自 浙江
0
d
昨天 来自 浙江
0https://www.acgo.cn/discuss/study/56393我发的题解,你看看可以吗?
昨天 来自 北京
0ooo 但是你的没有解释啊 同学们也看不懂这道题的意思但你就甩了代码 你加点解释吧!!!
昨天 来自 浙江
0
@MuktorFM HELLO
昨天 来自 浙江
0顶
昨天 来自 浙江
0@AC君求置顶
昨天 来自 浙江
0111
昨天 来自 浙江
0111
昨天 来自 浙江
0d
昨天 来自 浙江
0顶
昨天 来自 浙江
0%%%
昨天 来自 上海
0@MuktorFM 4题解+了 想上我师焉
昨天 来自 浙江
0我能替MF回复一下
昨天 来自 浙江
0我们考虑考虑,写的比较好
昨天 来自 浙江
0
@yaonainai hihihi 看到回复一下 谢谢
昨天 来自 浙江
0?
昨天 来自 浙江
0你florr叫啥 我们会一起玩:)))
昨天 来自 浙江
0对了 我想评我师焉
昨天 来自 浙江
0
顶
昨天 来自 浙江
0顶
昨天 来自 浙江
0
有帮助,赞一个