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不会再被更新

    愿你在迷茫时,记起自己的珍贵。
  • 相关阅读:
    Windows 解压缩XX.zip.001 XX.z01分卷文件的方法
    Android Library 发布开源库 JCenter & JitPack 攻略
    常见场景下Fragment和Activity的生命周期对比
    Android Studio 插件 ADBWifi 无线调试真机
    Flutter upgrade更新版本引发的无法启动调试APP的错误 target:kernel_snapshot failed”
    Glide异常:Failed to find GeneratedAppGlideModule 解决实践
    Android 讯飞语音听写SDK快速接入(附空指针解决和修改对话框文字方法)
    Android 自定义View—清爽小巧灵活的多节点进度条
    Android EXCEL 解析 xls 和 xlsx,方法其实很简单
    解决repo从codeaurora.org同步Android代码失败问题
  • 原文地址:https://www.cnblogs.com/casun547/p/11373400.html
Copyright © 2011-2022 走看看