题解:P12190 [蓝桥杯 2025 省 Java C] 小说
流水账版《名侦探柯南》。
题目大意
个人觉得挺好的一道构造题,挺能锻炼思维的。
我们要构造一部小说,只能有以下情节:
- \(A\) 发现 \(B\) 不知道真相。
- \(A\) 发现 \(B\) 知道真相。
- \(A\) 知道了真相。
还有 \(n\) 个人。
有以下限制:
- “\(B\) 发现 \(A\) 不知道真相”不能在“\(A\) 知道了真相”后。
- “\(B\) 发现 \(A\) 知道真相”不能在“\(A\) 知道了真相” 前。
- “\(B\) 发现 \(A\) 不知道真相”不能在“\(B\) 发现 \(A\) 知道真相”后。
- 相邻的两章情节类型不同,例如如果第一章是 \(A\) 发现 \(B\) 不知道真相那么第二章就不能是 \(C\) 发现 \(D\) 不知道真相。
- 完全相同的情节不能出现两次。
题目分析
经过略微思考过后,我们可以得出一个最理想的情况模式:
- 对于每个人:
- 除了自己的 \(n-1\) 个人发现自己不知道真相。
- 自己知道真相了。
- 除了自己的 \(n-1\) 个人发现自己知道真相。
这样我们可以得出最理想的答案是 \(2{n^2}-n\)。
考虑限制
很明显,最理想的情况绝对不是正确答案。因为题目还有诸多限制条件,我们一一考虑限制条件。
- 条件 \(1\)~\(3\)
- 很明显,没有必要考虑(就是不能自相矛盾,在刚才的理想情况中已经满足)。
- 条件 \(4\)
- 我们可以将顺序进行打乱,以满足相邻情节不会相同。
- 条件 \(5\)
- 很明显,开头与结尾不满足,需要特殊处理。
总结公式
- 开头结尾各 \(1\) 章。
- 中间部分知道或不知道情节共 \(2(n-1) \times (n-1)\)。
- 自己知道部分共 \(n\) 章。
公式:
\[ans=2{(n-1)}^2+n+2
\]
细节注意
- 因为数据范围,要使用
long long。 - 需要特判 \(n=1\) 的情况。
AC 代码实现
#include<bits/stdc++.h>
using namespace std;
int n;
long long ans;//开long long
int main()
{
scanf("%d",&n);
if(n==1) //特判
{
printf("1");
return 0;
}
ans=2*1ll*(n-1)*(n-1)+n+2;//套公式
printf("%lld",ans);
return 0;
}

浙公网安备 33010602011771号