【NOIP模拟】20140813 题解 & 总结

  继续每天一套模拟题啦啦啦~~~因为昨天的题目难度适中,而且我在比赛时使用的刷水分策略得当,导致我得到了一个非常适合形容自己的分数——222……

 

  T1Span

  原题:{屏蔽}……PS:以后可能都不会贴原题大图啦,因为有群众反映大图杀猫(……)

  题目大意:给出一个包含N个点M条无向边的图(N<=100),要求从M条边中选出N-1条边使得N个点两两相通,求这N-1条边中最长的边与最短的边边权之差的最小值。输入中包含多组数据(T<=6)。

  咋一看这道题很像最小生成树,不过题目的要求不是总代价最小,迷惑了很多无知少年……实际上因为N足够小,可以从M条边中枚举一条边作为生成树中的最短边,另外再选N-2条边,算出答案。看起来时间复杂度达到了O(M^2),但实际上并没有这么大(题目数据很水??)(应该是的,我也不清楚)。

 

var
    a,b:array[0..10000,1..3] of longint;
    f:array[1..100] of longint;
    t,n,m,i,j,k,x,y,p,ans:longint;
function min(x,y:longint):longint; begin if x
  
  
   
   =y then exit;
        i:=x;
        j:=y;
        m:=b[random(y-x+1)+x,3];
        repeat
            while b[i,3]
   
   
    
    m do dec(j);
            if i<=j then begin
                b[0]:=b[i];
                b[i]:=b[j];
                b[j]:=b[0];
                inc(i);
                dec(j);
            end;
        until i>j;
        qsort(x,j);
        qsort(i,y);
    end;
function getf(v:longint):longint; begin if f[v]=v then exit(v) else begin f[v]:=getf(f[v]); exit(f[v]); end; end;
begin
    randomize;
    assign(input,'span.in');reset(input);
    assign(output,'span.out');rewrite(output);
    readln(t);
    for t:=1 to t do begin
        readln(n,m);
        for i:=1 to m do readln(b[i,1],b[i,2],b[i,3]);
        qsort(1,m);
        ans:=maxlongint;
        for i:=1 to m do begin
            for j:=1 to n do f[j]:=j;
            k:=0;
            for j:=i to m do begin
                x:=getf(b[j,1]);
                y:=getf(b[j,2]);
                if x<>y then begin
                    f[y]:=x;
                    inc(k);
                    if k=n-1 then break;
                end;
            end;
            if k
    
    
   
   
  
  


  T2:无聊的草稿

  题目大意:给出一个包含N个点N-1条无向边的连通图(N<=10^6),求图上的任意一条链上的节点个数和与链上节点相邻的节点个数之和的最大值。

  看到“链”这个字,加上题目给出来的连通图实际上是一棵树,我们可以想到“树的直径”。但是相邻的节点怎么计数?有个简单的方法——直接将每个点的儿子个数作为这个点的“点权”,如果将“树的直径”中的边权改为点权,那么就相当于做“树的直径”了。

  求树的直径,我们可以以任何一个点为起点做最长路,找到与起点最远的节点;再以这个节点为起点做一次最长路,则此时求得的最远距离实际上就是树的直径。

 

var
    a,c:array[1..1000000] of longint;
    b:array[0..2000000,1..2] of longint;
    n,i,x,y,st,ans:longint;
procedure find(v,p,l:longint);
    var
        z:longint;
    begin
        if p>ans then begin ans:=p; st:=v; end;
        z:=a[v];
        while z>0 do begin
            if b[z,1]<>l then find(b[z,1],p+c[b[z,1]]-1,v);
            z:=b[z,2];
        end;
    end;
begin
    assign(input,'boring.in');reset(input);
    assign(output,'boring.out');rewrite(output);
    readln(n);
    for i:=1 to n-1 do begin
        readln(x,y);
        b[i*2-1,1]:=y;
        b[i*2-1,2]:=a[x];
        a[x]:=i*2-1;
        b[i*2,1]:=x;
        b[i*2,2]:=a[y];
        a[y]:=i*2;
        inc(c[x]);
        inc(c[y]);
    end;
    ans:=0;
    find(1,c[1]+1,0);
    find(st,c[st]+1,0);
    writeln(ans);
    close(input);close(output);
end.


  T3:锻炼身体

  原题:NOI2005“瑰丽华尔兹”数据弱化版

  题目大意:有一个N×M的迷宫,有些点是障碍。给出K个时间段,从起点出发,每个时间段中只能按照该时间段对应的方向行走或原地不动,求K个时间段后最长的行走距离。

  又是迷宫题……果断BFS搞起……实际上除了万能的BFS,可以设DP方程F[i,j,T]表示走完前T个时间段走到(i,j)的最长行走距离。时间复杂度看起来是O(NMK*Step),其中Step为一个时间段中能行走的最长距离。但因为K*Step实际值较小,所以仍然可以AC(据说连作为此题数据加强版的“瑰丽华尔兹”也能过)。

 

const
    fx:array[1..4,1..2] of longint=((-1,0),(1,0),(0,-1),(0,1));
    maxd=2000000;
var
    a:array[0..201,0..201] of boolean;
    b:array[0..200,1..3] of longint;
    f:array[0..201,0..201,1..4] of longint;
    d:array[1..maxd,1..3] of longint;
    p:array[1..200,1..200,0..200] of longint;
    n,m,c,i,j,k,ans,x,y,t:longint;
    ch:char;
function min(x,y:longint):longint; begin if x
   
   
    
    b[j,1] then begin
                b[0]:=b[i];
                b[i]:=b[j];
                b[j]:=b[0];
            end;
    i:=0;
    j:=1;
    ans:=0;
    while i<>j do begin
        i:=i mod maxd+1;
        if d[i,3]=c then break;
        t:=d[i,3]+1;
        k:=min(f[d[i,1],d[i,2],b[t,3]],b[t,2]-b[t,1]+1);
        for k:=0 to k do begin
            x:=d[i,1]+fx[b[t,3],1]*k;
            y:=d[i,2]+fx[b[t,3],2]*k;
            if p[x,y,t]
    
    
     
     ans then ans:=p[x,y,t];
            end;
        end;
    end;
    writeln(ans);
    close(input);close(output);
end.

    
    
   
   


  T4Train

  题目大意:有N个车站按编号顺序排成一行(N<=200),有一列列车会依次通过这N个车站。有M节车厢(M<=200),每个车厢有一个起始车站和终点车站,每节车厢在起始车站接上列车并在终点车站从列车上卸下。车厢只能在列车的头或尾接上,也只能在这两端被卸下。求一个合法的操作序列。

  给这题跪了……虽然这道题很像NOIP2008“双栈排序”,但区别在于这道题是一个双头队列,不是两个栈……根据解题报告,正解是枚举每节车厢接上列车的哪一侧(即搜索)加上剪枝。不过由于报告的作者表达能力不佳,导致连moreD神犇都不知道报告究竟想说什么……因此无人能解……

 

  总结:T1我用上了错误的方法但得到了70分,T2暴力40分,T3顺利过关,T4打无解的情况怒刷12分(无视之)……不得不说做这套题简直就像是在做一场“搜索专题训练”……各种暴力……这不得不提醒我:实际上正解很有可能就是暴力的时间空间优化版,不能小看暴力的威力啊!另外因为在做T3时打上了对拍找到了Bug,因此顺利地AT3,感觉那是相当的好……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习是一种人工智能(AI)的子领域,致力于研究如何利用数据和算法让计算机系统具备学习能力,从而能够自动地完成特定任务或者改进自身性能。机器学习的核心思想是让计算机系统通过学习数据中的模式和规律来实现目标,而不需要显式地编程。 机器学习应用非常广泛,包括但不限于以下领域: 图像识别和计算机视觉: 机器学习在图像识别、目标检测、人脸识别、图像分割等方面有着广泛的应用。例如,通过深度学习技术,可以训练神经网络来识别图像中的对象、人脸或者场景,用于智能监控、自动驾驶、医学影像分析等领域。 自然语言处理: 机器学习在自然语言处理领域有着重要的应用,包括文本分类、情感分析、机器翻译、语音识别等。例如,通过深度学习模型,可以训练神经网络来理解和生成自然语言,用于智能客服、智能助手、机器翻译等场景。 推荐系统: 推荐系统利用机器学习算法分析用户的行为和偏好,为用户推荐个性化的产品或服务。例如,电商网站可以利用机器学习算法分析用户的购买历史和浏览行为,向用户推荐感兴趣的商品。 预测和预测分析: 机器学习可以用于预测未来事件的发生概率或者趋势。例如,金融领域可以利用机器学习算法进行股票价格预测、信用评分、欺诈检测等。 医疗诊断和生物信息学: 机器学习在医疗诊断、药物研发、基因组学等领域有着重要的应用。例如,可以利用机器学习算法分析医学影像数据进行疾病诊断,或者利用机器学习算法分析基因数据进行疾病风险预测。 智能交通和物联网: 机器学习可以应用于智能交通系统、智能城市管理和物联网等领域。例如,可以利用机器学习算法分析交通数据优化交通流量,或者利用机器学习算法分析传感器数据监测设备状态。 以上仅是机器学习应用的一部分,随着机器学习技术的不断发展和应用场景的不断拓展,机器学习在各个领域都有着重要的应用价值,并且正在改变我们的生活和工作方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值