1 条题解

  • 0
    @ 2025-8-24 23:13:33

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar yanmingqian
    莫等痛时才知痛

    搬运于2025-08-24 23:13:33,当前版本为作者最后更新于2025-04-15 14:31:14,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    神秘构造。

    贪心考虑,为了尽量让章节多,要让 nn 个人都知道一遍真相,一个人知道真相之前,要尽量让更多人发现他不知道真相,一个人知道真相之后,要尽量让更多人发现他知道真相。

    我们假设现在甲刚刚知道了真相,下一个知道真相的人是乙。那么中间要写的几个章节是让除了甲之外的 (n1)(n-1) 个人都知道甲知道了真相,让除了乙之外的 (n1)(n-1) 个人都知道乙不知道真相。由于总共有 nn 个人,类似的连续情节会发生 (n1)(n-1) 次。

    特别地,在第一个知道真相的人知道真相之前,发现他不知道真相的人只能有一个,因为此时没有人发现真相,那么没有人会发现某个人知道真相,这样为了情节不重复,只能第二章是一个人发现了真相。同理,最后一个人发现真相之后,也只有一个人能发现最后一个人发现了真相。

    这样最终答案就是 2×(n1)×(n1)+n+22\times(n-1)\times(n-1)+n+2,化简一下就是 2n23n+42n^2-3n+4。注意当 n=1n=1 时,只能有一个章节,需要特判。

    代码就很简单了。

    C++ 代码:

    #include<iostream>
    using namespace std;
    int main(){
        long long n;
        cin>>n;
        if(n==1){
            cout<<1;
            return 0;
        }
        cout<<2*n*n-3*n+4;
        return 0;
    }
    

    鉴于我之前交蓝桥杯 Python 组的题解因为没有 python 代码被打回了,特意让 deepseek 帮我写了一份 Java 代码(第一遍还编译错误了,害得我专门去研究了一下):

    import java.util.Scanner;
    public class Main{
        public static void main(String[] args) {
            Scanner scanner=new Scanner(System.in);
            long n=scanner.nextInt();
            if(n==1){
                System.out.println(1);
            } 
            else{
                System.out.println(2*n*n-3*n+4);
            }
        }
    }
    
    • 1

    信息

    ID
    12036
    时间
    3000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者