zoukankan      html  css  js  c++  java
  • NOIP Day1总结

    Day1T1玄学考试

    在开始之前,我犯了考前综合症,各种不安各种焦躁。

    结果当我去到考场的时候,看了T1......

    T1:road

    这不是裸的原题么这!我当时心里瞬间想到积木大赛。这明显就是积木大赛的改装!只不过积木大赛是向上堆出一座小山,而这个是把路填平。

    有啥区别啊这!于是我就把我曾经写的照搬上去:

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int main()
    {
        int n,ans=0;
        scanf("%d",&n);
        int l=0;
        for(int i=1;i<=n;i++)
        {
            int t;
            scanf("%d",&t);
            if(t>l)
                ans+=t-l;
            l=t;
        }
        printf("%d\n",ans);
        return 0;
    }
    

    然后100分就到手了2333。

    做完之后我抬头看了一眼我的隔壁,只看见他写的其中一行就知道他要爆零了:sort(d+1,d+1+n);

    这行会直接彻底让你的程序只输出最大坑的深度值,然后就没有然后了。。。

    洛谷上出现了自测,于是赛后我就跑过去自测了一下。你就有了\(\color {green}{AC}\)

    T2:money

    这题我拿到后是彻底的懵了,这个题目难度简直像是梯度上升啊!有点小紧张,于是想到学长的话:

    “第二、三题你就拿个\(\huge \color {lightblue} {部分的分}\)就好了。”

    我看了看题目,总算看懂了:\(m\)不会大于\(n\)的,而且不能再在这个数组以外的数字去选。说明了我们\(n=2\)的时候\(m\)只有两个选择:\(m=1,m=2\)

    于是跑去看看部分分,很好,有可以拿的:\(n=2\)。但是有点小紧张,因为感觉看不懂题目。在重新平稳了一下自己后,我开始想:题目给的\(n\)都是大于2的,我手造数据似乎总是很玄学的看不出规律,那么.....?

    再次引用学长的话:

    手造数据不可信的时候,搞一个\(\huge \color {lightblue}{数据生成器}\)就完事了

    于是开始造数据生成器:

    #include<iostream>
    using namespace std;
    int main()
    {
        srand(clock());
        int n=2;
        while(1)
        {
            int a=rand()%20+1;
            int b=rand()%20+1;
            printf("%d\n%d %d\n",n,a,b);
        }
        return 0;
    }
    

    使用while(1)是因为这样我可以无限的制造数据来观察。

    于是观察了几组:

    第一组:2 7 4,第二组:2 16 14,第三组:2 4 16

    突然发现诶,如果a%b==0成立,那么b就可以取代a成为独立的货币。即\(m=1\)。否则\(m=2\)。然后匆忙写完。

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int main()
    {
        int n,t;
        scanf("%d",&t);
        for(int i=1;i<=t;i++)
        {
            cin>>n;
            if(n==2)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                if(a%b==0||b%a==0||(a+b)%a==0||(a+b)%b==0)
                    cout<<"1"<<endl;
                else
                    cout<<"2"<<endl;
            }
        }
        return 0;
    }
    

    然后你就有\(\color {red}{15}\)分的好成绩:

    T3:track

    好吧这题完全超出了我的能力范围......即使是部分分 \(\small \color {black}{还不是你没弄懂Floyd}\)

    仔细看了看部分分:\(a_i=1\),说明了这个图会退化成一棵只有根节点的树:

    但是我又注意到了一个:\(m=1\),也就是说:当我们\(a_i=1,m=1\)的时候,为了取最小值最大化,那就是可以直接取所有的道路,全部建成道路,这时候直接输出所有的道路总长就完事了:

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int w[30010];
    int tw;
    int n,m;
    int main()
    {
        bool cheat_a1=true;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n-1;i++)
        {
            int u,v;
            scanf("%d%d%d",&u,&v,&w[i]);
            if(u==1)
                cheat_a1=true;
            tw+=w[i];
        }
        if(cheat_a1&&m==1)
            cout<<tw<<endl;
        return 0;
    }
    
    

    预期是5pts(\(Q\omega Q\)),暂时不知道评测结果,估计会凉掉。

    考试的时候当场尝试\(Floyd\)

    void floyd()
    {
        for(int k=1;k<=n;k++)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    e[i][j]=e[i][k]+e[k][j];
                }
            }
        }
    }
    

    然后就爆掉了,当场\(\color {purple}{RE}\)....QAQ

    然后看了看之前我到底干了什么,当时在想:要跑最大路,可是我似乎不会如何改造\(\color {blue}{Floyd}\)为最大路,于是我转向另一个思考方向:如果我把所有的权值全部转换成负数呢?这么一来就可以跑最小路了(吧)。

    于是我加了一句:edge[u][v]=-w[i];(之前开了\(edge[][]\)数组来玩邻接矩阵)然后就跑炸了期望是\(\color {red}5\)分,然后洛谷跑出了这个:

    wc多了\(\color {red}5\)分!对于我简直是\(\huge \color {green}{AC}\)
    不过洛谷的数据说不准,但是能说明我那个部分分过了。

    也就是说我今天的分数是:\(\huge \color {green}{120}\)(本来预计是\(\color {blue}{115}\)的)

    完美

    \(\small \color {grey}{成功的把Tetris玩到了900分,在Adventure里面找到隐藏房间1,获得物品:绿宝石手链}\)

  • 相关阅读:
    软件工程 团队开发(2)
    软件工程 团队开发(1)
    大道至简阅读笔记01
    小工具集合用户模板和用户场景
    人月神话阅读笔记03
    人月神话阅读笔记02
    本周java学习
    本周学习总结
    本周java 学习进度报告
    《构建之法》读后感
  • 原文地址:https://www.cnblogs.com/ComputerEngine/p/9940134.html
Copyright © 2011-2022 走看看