zoukankan      html  css  js  c++  java
  • 中山纪中Day1--普及

    早上一起,扑面是瓢泼的大雨。跨过千山万水,来到纪中门前,毅然以一种大无畏的英雄气概跨进了考场。

    面对四道神题。然后,我成功过五关斩六将,A掉了2道题!!!

    收获:优先队列(大、小根堆)


    T1:APPLE

            Wexley最近发现了一个古老的屏幕游戏。游戏的屏幕被划分成n列。在屏幕的底端,有一个宽为m列的篮子(m<n)。在游戏过程中,Wexley能左右移动这个篮子,            Wexley的操作很犀利,移动是瞬间完成的,但是篮子必须始终都在屏幕中。 苹果从屏幕的顶端落下,每个苹果从n列中的某一列顶端掉落,垂直掉落到屏幕的底端。每个苹果总是在上一个苹果掉落到底端的时候开始掉落。Wexley想要通过移动篮子来接住所有的苹果。起先,篮子在屏幕的最左端。
            求出Wexley要接住所有的苹果所需移动的最短距离。 

    思路:此题略简单,设置左端与右端,然后判断,移动,储蓄即可。

    见代码:

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int n,m,k,a[21],l=1,r,ans;
    int main()
    {
        //freopen("apple.in","r",stdin);
        //freopen("apple.out","w",stdout);
        scanf("%d%d%d",&n,&m,&k);
        r=m;
        for(int i=1;i<=k;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]>r)
            {
                while(a[i]>r)
                {
                    ans++;
                    l++;
                    r++;
                }
            }
            while(a[i]<l)
            {
                ans++;
                l--;
                r--;
            }
        }
        printf("%d",ans);
        return 0;
    }

     好题哉!!!


    T2:BRICK

            Leo是一个快乐的火星人,总是能和地球上的OIers玩得很high。
             2012到了,Leo又被召回火星了,在火星上没人陪他玩了,但是他有好多好多积木,于是他开始搭积木玩。
           火星人能制造n种积木,积木能无限供应。每种积木都是长方体,第i种积木的长、宽、高分别为li、wi、hi。积木可以旋转,使得长宽高任意变换。Leo想要用这些积木搭一个最高的塔。问题是,如果要把一个积木放在另一个积木上面,必须保证上面积木的长和宽都严格小于下面积木的长和宽。这意味着,即使两块长宽相同的积木也不能堆起来。
           火星上没有电脑,好心的你决定帮助Leo求出最高的塔的高度。

            对于30%的数据 n<=8
            对于100%的数据 n<=3000,最后答案不会超过32位整型

     题意:相对清楚,下面看思路。

     思路:因为是要严格小于,所以每种积木都只能用一次,我们把六种情况搞下来,然后因为长大于宽,所以可以排除掉一半。接着在以长宽各自排序,会出现一个序列。接着就是我们最熟悉的,最简单的DP模板:最长         单调下降序列。只不过最长变成了高之和最大,下降是长宽都小,仅此而已。然后考虑了下nlogn的情况,发现替换会很奇怪,可能出问题。也就只打了n2的算法。那也就这样了。因为3*n=9000,所以不会有问题。

    见代码:

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int n,h1,l1,w1,k,le=1,b[9001],ans=-0x3f3f3f;
    struct brick{
        int h,l,w;
    };
    brick a[9001];
    bool cmp(brick x,brick y)
    {
        return x.l>y.l;
    }
    bool cmp1(brick x,brick y)
    {
        return x.w>y.w;
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&h1,&l1,&w1);
            a[3*i-2].w=min(h1,l1);a[3*i-2].l=max(h1,l1);a[3*i-2].h=w1;
            a[3*i-1].w=min(w1,h1);a[3*i-1].l=max(w1,h1);a[3*i-1].h=l1;
            a[3*i].w=min(w1,l1);a[3*i].l=max(w1,l1);a[3*i].h=h1;
            
        }
        sort(a+1,a+3*n+5-5+1,cmp);
        while(k<=3000)
        {
            k++;
            if(a[k].l!=a[k-1].l)
            {
                sort(a+le,a+k-1+1,cmp1);
                le=k;
            }
        }
        for(int i=1;i<=3*n;i++)
        {
            b[i]=a[i].h;
        }
        for(int i=1;i<=3*n;i++)
        {
            for(int j=i-1;j>=1;j--)
            {
                if(b[j]+a[i].h>=b[i]&&a[j].l>a[i].l&&a[j].w>a[i].w)
                b[i]=b[j]+a[i].h;
            }
        }
        for(int i=1;i<=3*n;i++)
        {
            if(b[i]>=ans)
            ans=b[i];
        }
        printf("%d",ans);
        return 0;
    }

    好题哉!!!


    T3:TREELAND

           Treeland是一个有n个城市组成的国家,其中一些城市之间有单向边连通。在这个国家中一共有n-1条路。我们知道,如果我们不考虑路的方向,那么我可以从任意城市到达任意城市。
          最近,Treeland的总理Candy为了发展经济,想要从这n个城市中选择一个作为Treeland的首都,首都必须要能到达其他任意城市,这使得有些道路必须反向,付出的代价即需要反向的道路条数。
          Candy想要选择一个城市作为首都,使得付出的代价最小。可能有多个城市满足条件,按编号从小到大输出。   

    思路:根据题解,先从1号节点遍历整棵树,让1号节点满足要求,可知需要的答案。然后顺便在遍历的过程中求出对节点u,需要几次反转让u能到达以u为子树的每个节点。完成之后,让u点可以走到1号点,这样的反转条数就是从1点到u点反转的次数。然后加上之前记录下的东西就可以了。


    T4:STUDY

                马上假期就要到了,THU的神犇Leopard假期里都不忘学霸,现在有好多门功课,每门功课都耗费他1单位时间来学习。
               他的假期从0时刻开始,有1000000000个单位时间(囧rz)。在任意时刻,他都可以任意一门功课(编号1~n)来学习。
               因为他在每个单位时间只能学习一门功课,而每门功课又都有一个截止日期,所以他很难完成所有n门功课。
               对于第i门功课,有一个截止时间Di,若他能学完这门功课,他能够获得知识Pi。
               在给定的功课和截止时间下,Leopard能够获得的知识最多为多少呢?

     思路:必须得有一个反悔的过程,DP不大现实,贪心一次性贪完也不大现实。所以就出现了一个新的思路:将时间排序,有就放,如果没时间放,就和最小的比较,交换,再维护一个小根堆即可。

        详见:YYCAKIOI


    总体来说,今天200分,考了个第三出来,成绩还算可以,争取消化干净,继续努力!

  • 相关阅读:
    设计模式--单例模式(Singleton)
    C# 和.Net 特性
    Fiddler 教程
    史铁生遗作:昼信基督夜信佛
    如何实现早日退休理想
    Linux 常用
    Golang 读书
    Python 读书
    RbMQ 简介
    UML 简介
  • 原文地址:https://www.cnblogs.com/qing1/p/11281984.html
Copyright © 2011-2022 走看看