【CH Round #49 - Streaming #4】比赛题解 & 总结

在本次比赛中,作者在理解题目时遇到了困难,尤其是T2题目的数学知识缺失导致失分严重。作者在比赛中拿下T1,T2和T3只有20分,共140分。主要问题在于数学知识的缺失,如未能正确解决T2题目的勾股数问题,以及程序检查不周导致T3得分不佳。作者反思了阅读题目的重要性,强调了读懂题目的关键性和避免被文字误导的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  这次day2的比赛感觉难度比day1稍稍大了点(看懂题目和做出题目的难度都大……),语文没学好果然是个问题。看懂了题目之后再看别人提问就觉得无语——题目不是交代了么(虽然不容易看出来)?


  题目:传送门【 http://contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9BDay2)

 

  T1:二叉树的根

  题目大意:给出一个无根树,就是一个有N个点、N-1条边的连通图(N<=100000),问你有哪些点可以作为一棵二叉树的根。

  首先如果树上存在度数大于3的点,就没有任何一个点符合条件(选哪个点作根,度数大于3的点都会至少有3个儿子)。其次度数为3的点不能作为树根(选它为树根则它有3个儿子,样例的提示很明显),因此度数为12的点就可以作为树根。时间复杂度O(N)

 

var
    a:array[1..100000] of longint;
    n,i,c,x,y:longint;
begin
    assign(input,'root.in');reset(input);
    assign(output,'root.out');rewrite(output);
    readln(n);
    c:=n;
    for i:=1 to n-1 do begin
        readln(x,y);
        inc(a[x]);
        inc(a[y]);
        if (a[x]>3) or (a[y]>3) then begin
            writeln(0);
            close(input);close(output);
            halt;
        end;
        if a[x]=3 then dec(c);
        if a[y]=3 then dec(c);
    end;
    writeln(c);
    for i:=1 to n do if a[i]<3 then write(i,' ');
    writeln;
    close(input);close(output);
end.


  T2:距离统计

  题目大意:给出一个N×M的点阵(NM<=10^9),两两顶点间构成一条线段,问长度为L的线段有多少条(L为整数且保证有解),一共询问T次(T<=1000)。

  很明显横向和纵向的线段是可以直接计算出来的,非常简单。但是斜线的话……

  这道题比较DT的原因是要解a^2+b^2=L^2,其中ab为整数,L为已知数。怎么解?朴素的方法是枚举ab,时间复杂度O(TN)。有什么更好的方法吗?

  通过对公式x^2+y^2=z^2(其中gcd(x,y,z)=1)的整理可知,z-y必定为完全平方数或完全平方数的2倍(由于其证明过于高大上,请自行看比赛解题报告中的证明)。因此首先从所有L的约数中枚举gcd(a,b,L),设为p。令z=L/p,此时只要枚举一个数i,那么i^2或者2i^2就有可能是z-y的值,由此推出yx。最后判断gcd(x,y,z)是否为1即可,如果是,则a=x*pb=y*p(显然)。

 

const
    maxp=50000;
var
    a:array[0..30000] of longint;
    f:array[2..maxp] of boolean;
    c:array[1..30000,1..2] of longint;
    n,m,l,ans:int64;
    t,i,j,nc:longint;
procedure add(x,y:int64);
    begin
        if (x
 
  0) do begin
            if a[i]*a[i]>l then break;
            while l mod a[i]=0 do begin
                inc(nc);
                c[nc,1]:=a[i];
                c[nc,2]:=0;
                while l mod a[i]=0 do begin
                    inc(c[nc,2]);
                    l:=l div a[i];
                end;
            end;
            inc(i);
        end;
        if l>1 then begin inc(nc); c[nc,1]:=l; c[nc,2]:=1; end;
    end;
function gcd(a,b:int64):int64; begin if b=0 then exit(a) else exit(gcd(b,a mod b)); end;
procedure check(x:int64);
    var
        i:longint;
        a,b,p:int64;
    begin
        for i:=1 to x do begin
            b:=x-i*i;
            if b<=0 then break;
            p:=x*x-b*b;
            a:=trunc(sqrt(p));
            if a>=b then break;
            if (a*a=p) and (gcd(x,gcd(a,b))=1) then add(a*(l div x),b*(l div x));
        end;
        for i:=1 to x do begin
            b:=x-i*i*2;
            if b<=0 then break;
            p:=x*x-b*b;
            a:=trunc(sqrt(p));
            if a>=b then break;
            if (a*a=p) and (gcd(x,gcd(a,b))=1) then add(a*(l div x),b*(l div x));
        end;
    end;
procedure dg(v:longint;l:int64);
    var
        i:longint;
    begin
        if v>nc then check(l)
        else
            for i:=0 to c[v,2] do begin
                dg(v+1,l);
                l:=l div c[v,1];
            end;
    end;
begin
    for i:=2 to maxp do begin
        if not f[i] then begin inc(a[0]); a[a[0]]:=i; end;
        for j:=1 to a[0] do begin
            if i*a[j]>maxp then break;
            f[i*a[j]]:=true;
            if i mod a[j]=0 then break;
        end;
    end;
    assign(input,'dist.in');reset(input);
    assign(output,'dist.out');rewrite(output);
    readln(n,m,t);
    for t:=1 to t do begin
        read(l);
        ans:=0;
        if l
  
     


  总结:这次比赛中我拿下T1T2T3只有20分,一共140。如上所说,我在理解题目(特别是T3)的时候出现了一些困难,以为T3可能存在混联电路,还打算恶补物理(……)。幸好最后看清题目,知道怎么下手。这次比赛主要存在的问题是数学知识的缺失。T2就是一个典型的例子。我还以为所有的勾股数都可以通过一些自己总结的公式算出来(一些派生勾股数就不行),如果T2老老实实枚举ab,就可以多拿40分……而T3纯粹是因为程序打错,比赛结束之后我改了两句就AC了,可见检查不够周到。不过庆幸的是读懂了题,没有被文字卡住。可惜比赛时大部分时间都用作推理和实现程序,并没有对拍,这点一定要加倍注意。

内容概要:本文档详细介绍了一个基于MATLAB实现的电力负荷预测项目,该项目运用遗传算法(GA)优化支持向量回归(SVR)和支持向量机(SVM)模型的超参数及特征选择。项目旨在解决电力系统调度、发电计划、需求侧响应等多个应用场景中的关键问题,特别是在应对高比例可再生能源接入带来的非线性、非平稳负荷预测挑战。文中涵盖了从数据接入、特征工程、模型训练到部署上线的全流程,包括详细的代码示例和GUI设计,确保方案的可复现性和实用性。 适用人群:具备一定编程基础,尤其是熟悉MATLAB语言和机器学习算法的研发人员;从事电力系统调度、电力市场交易、新能源消纳等相关领域的工程师和技术专家。 使用场景及目标:①通过构建面向小时级别的滚动预测,输出高分辨率负荷轨迹,为日内与日前滚动调度提供边际成本最小化的依据;②在负荷高峰和供给紧张时,通过价格信号或直接负荷控制实施需求侧响应,提升削峰效率并抑制反弹;③为灵活性资源(调峰机组、储能、可中断负荷)提供更清晰的出清路径,降低弃风弃光率,提升系统整体清洁度;④帮助市场主体更准确地评估边际出清价格变化,提高报价成功率与收益稳定性,同时降低由预测偏差带来的风险敞口;⑤在运维与审计场景中,对预测产生的原因进行说明,保障业务侧与监管侧的可追溯性。 阅读建议:此资源不仅提供了完整的代码实现和GUI设计,更注重于理解GA优化过程中涉及到的数据处理、特征构造、模型选择及评估等核心步骤。因此,在学习过程中,建议结合实际案例进行实践,并深入研究每个阶段的具体实现细节,特别是适应度函数的设计、超参数空间的定义以及多样性维护机制的应用。此外,关注项目中关于数据对齐、缺失值处理、特征标准化等方面的最佳实践,有助于提高模型的鲁棒性和泛化能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值