题解: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;
}
posted @ 2025-11-15 11:17  linruicong  阅读(3)  评论(0)    收藏  举报