zoukankan      html  css  js  c++  java
  • 考试总结 模拟25

    心得:

    这次最主要的失误在了T1 catalan数没看出来,

    T3还行,原题,码的很快,虽然有瑕疵,但还是紧紧张张拿到了TLE40,时间再多点就能好好想想建图

    T2似乎有个特别显然的性质就能拿到暴力55分

    T1[A.字符串][catalan]

    Oh,no!!又一次出卡特兰数,又一次翻车,还是没有看出来??!!

    可能是这次立志要刚出来一个dp题,所以就没怎么往数学那里想

    不说了,40%的dp写了2个小时

    T2[B.乌鸦喝水]

    很好的一道思维题

    首先每个缸都可以求出来最多能喝多少次,然后按照从小到大排序

    一个十分显然的性质就是,前面的够删的话,后面的也够

    从前往后枚举每个缸,比较这个缸剩余的删除次数和后面缸的个数

    如果大于,那么就相当于这个缸对答案的贡献是其能减的层数,也就是已经进行的轮数,取余之后,

    也就是在这一轮,看这个缸还能不能对ans做贡献,如果这个id之前还能删的缸的个数大于了当前的res值,那就不能,否则+1

    注意两个特判

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<vector>
     5 #include<cstdlib>
     6 #include<cstring>
     7 #include<algorithm>
     8 #define R register
     9 #define int long long
    10 using namespace std;
    11 const int maxn=100005;
    12 int n,m,k,a[maxn],w[maxn],ans;
    13 inline int read()
    14 {    
    15     int x=0;char ch=getchar();
    16     while(ch>'9'||ch<'0')ch=getchar();
    17     while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    18     return x;
    19 }
    20 struct node{
    21     int id,res,det;
    22 }b[maxn];
    23 bool cmp(node x,node y){return x.res<y.res;}
    24 int t[maxn];//还有多少活着
    25 inline int ask(int x)
    26 {
    27     int ret=0;
    28     for(;x;x-=(x&-x))
    29         ret+=t[x];
    30     return ret;
    31 }
    32 inline void add(int x,int w)
    33 {
    34     for(;x<=n;x+=(x&-x))
    35         t[x]+=w;
    36 }
    37 signed main()
    38 {
    39     //freopen("data","r",stdin);
    40     n=read(),m=read(),k=read();
    41     for(int i=1;i<=n;++i)
    42         b[i].res=k-read(),b[i].id=i;
    43     for(int i=1;i<=n;++i)
    44         b[i].det=read();
    45     for(int i=1;i<=n;++i)
    46         b[i].res=(b[i].res)/b[i].det+1;
    47     sort(b+1,b+n+1,cmp);
    48     int ans=0;
    49     for(int i=1;i<=n;++i)
    50         add(i,1);
    51     for(int i=1;i<=n;++i)
    52     {
    53         int las=ans;
    54         int res_num=n-i+1;
    55         b[i].res-=ans;
    56         if(b[i].res<0){
    57             add(b[i].id,-1);
    58             continue;
    59         }//注意判断<0的情况
    60         ans+=b[i].res/res_num;
    61         b[i].res%=res_num;
    62         int bef=ask(b[i].id);
    63         if(bef<=b[i].res)
    64             ans++;
    65         if(ans>las+m)ans=las+m;//取个min
    66         add(b[i].id,-1);
    67 
    68     }
    69     printf("%lld
    ",ans);
    70 }
    View Code

    T3[C.所驼门王的宝藏]

    原题,就是建图稍恶心,

    突然发现考场上打的是错的拓扑排序,稍慢,但是不会WA

    再理解一下这两个题,其实这是一个拓扑排序加上一个dp思想

    dp   :是说f[v]=max{f[u]+w[v]}  有向边<u,v,w>,v从其所有父节点的f值找到一个最大的转移过来

    拓扑排序  :保证了队列中能转移过来的节点都是ind为0,也就是ans不会再被更新

    愿你在迷茫时,记起自己的珍贵。
  • 相关阅读:
    BZOJ 2034 【2009国家集训队】 最大收益
    vijos P1780 【NOIP2012】 开车旅行
    BZOJ 2115 【WC2011】 Xor
    BZOJ 3631 【JLOI2014】 松鼠的新家
    BZOJ 4717 改装
    BZOJ 2957 楼房重建
    BZOJ 4034 【HAOI2015】 T2
    BZOJ 1834 【ZJOI2010】 network 网络扩容
    BZOJ 2440 【中山市选2011】 完全平方数
    BZOJ 2733 【HNOI2012】 永无乡
  • 原文地址:https://www.cnblogs.com/casun547/p/11373400.html
Copyright © 2011-2022 走看看