• EZ 2018 03 16 NOIP2018 模拟赛(四)


      链接:http://211.140.156.254:2333/contest/64

      我去掉了一百多分!

      这次的题目怎么说呢,特别水,但是就是出现了一些很逗的错误导致炸裂。

      最好笑的是SB的不只我一个:

      hl666:T1没写负数读优,100炸成40

      yu‘ao:T1写了判负数的但最后忘记乘上去了,100炸35

      cjj:T2输出没写lld写d爆0了

      zi’tai:作死写了clock导致爆0

      ye‘ke’he:把T2的CODE交到T1去了,真的逗比,T1爆0

      然后全部掉了一百多分

      T1 水题不解释。

      每次贪心让所有比他强的人互相摩擦,如果有多的挑一个比他弱的摩擦。

      然后自己挑一个弱的摩擦,如果无法实现证明他GG了。

      注意这里的弱指:能力值小于等于这个人(随机=获胜)

      吐槽一下所有样例不开负数读优都能过(还是自己菜)

      CODE

    #include<cstdio>
    using namespace std;
    int n,t,x,h,l,i;
    inline void read(int &x)
    {
        x=0; char ch=getchar(); int flag=1;
        while (ch<'0'||ch>'9') { if (ch=='-') flag=-1; ch=getchar(); }
        while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
        x*=flag;
    }
    int main()
    {
        //freopen("A.in","r",stdin); freopen("A.out","w",stdout);
        read(n); read(t);
        for (i=1;i<n;++i)
        {
            read(x);
            if (x<=t) ++l; else ++h;
        }
        for (i=0;(1<<i)<=n;++i)
        {
            if (l==0){ printf("%d",i); return 0; }
            h/=2; l=(l-1)/2;
        }
        return 0;
    }

      T2 一道贪心+DP的好题。

      乍一看是个背包,由于数据很大不可能直接上模板,但有一个性质:体积只有1,2,3,而且当体积相同时取价值最大的一定更优

      因此,考虑85分的暴力:预处理出所有的费用的前缀和。再枚举体积为3,为2的物品。大致是O(n^2)的。

      所以这里可以用三分优化(不是二分,因为这是个单峰函数,并没有单调性)来选体积为2的物品,就可以A了

      但这里还有另外一种做法,令f[i]表示当体积为i时,选择了多少体积为1的和体积为2的。

      转移就很简单了(具体看代码)

      然后我们再枚举3的个数,照样用前缀和即可,复杂度为O(m),其实是更优异的一种算法

      CODE

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    const int N=100005,M=300005;
    struct dp
    {
        LL v;
        int s1,s2;
    }f[M];
    int a[4][N],num[4],n,m,opt,x;
    LL sum[N];
    inline char tc()
    {
        static char fl[100000],*A=fl,*B=fl;
        return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
    }
    inline void read(int &x)
    {
        x=0; char ch=tc();
        while (ch<'0'||ch>'9') ch=tc();
        while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
    }
    inline bool comp(int a,int b)
    {
        return a>b;
    }
    int main()
    {
        //freopen("B.in","r",stdin); freopen("B.out","w",stdout);
        register int i;
        read(n); read(m);
        for (i=1;i<=n;++i)
        {
            read(opt); read(x);
            a[opt][++num[opt]]=x;
        }
        for (i=1;i<=3;++i)
        sort(a[i]+1,a[i]+num[i]+1,comp);
        for (i=1;i<=num[3];++i)
        sum[i]=sum[i-1]+a[3][i];
        for (i=1;i<=m;++i)
        {
            f[i]=f[i-1];
            if (f[i].v<f[i-1].v+a[1][f[i-1].s1+1])
            {
                f[i].v=f[i-1].v+a[1][f[i-1].s1+1];
                f[i].s1=f[i-1].s1+1;
                f[i].s2=f[i-1].s2;
            }
            if (i>=2&&f[i].v<f[i-2].v+a[2][f[i-2].s2+1])
            {
                f[i].v=f[i-2].v+a[2][f[i-2].s2+1];
                f[i].s1=f[i-2].s1;
                f[i].s2=f[i-2].s2+1;
            }    
        }
        LL ans=0;
        for (i=0;i<=num[3];++i)
        {
            if (i*3>m) break;
            ans=sum[i]+f[m-i*3].v>ans?sum[i]+f[m-i*3].v:ans;
        }
        printf("%lld",ans);
        return 0;
    }

      T3 难度很高,还是第一次打提交答案题。一道THUWC 2017的题目

      你肯定是在逗我吧!(水王属性附体)

      然后第一个点爆搜,其他全部乱写(至少每个点至少都有一到两分),最终水了27分。

      接下来又到了看Solution的时间

    似乎NPC啊 那就只能对着一个一个点看咯

    case1 暴搜吧 case2 剪剪枝也就过去了

    case3 只有一个背包 那就直接跑dp

    case4 case5 所有物品体积一样 那就跑费用流

    case6 体积基本一样 有一个小的扰动值 大胆猜测不会对答案有影响 还是跑费用流

    case7 只有一个物品体积不一样 枚举然后费用流

    case 8 9 10 有点看不懂啊 直接random_shuffle然后跑贪心吧

       好了,主要还是T1炸了,不然水个前5没什么问题

  • 相关阅读:
    PKU 3984 迷宫问题
    九度 1341 艾薇儿的演唱会
    九度 1335
    SDUT 1198 鞍点计算
    POJ 1363 Rails
    SDUT 1570 C旅行
    HDU 1042 N!
    SDUT 1568 俄罗斯方块
    HDU 1257 最少拦截系统
    POJ 3750 小孩报数问题
  • 原文地址:https://www.cnblogs.com/cjjsb/p/8641307.html
Copyright © 2020-2023  润新知