2023年多校联训NOIP层测试1

T1 luogu P6882 [COCI2016-2017#3] Imena \(50pts\)

  • 赛场上被如何输入和判断是否合法薄纱了,赛后发现还有数字这一说,而且原题面也没看懂(还是我太拉了)。
  • 打这题时把语音选成C了,然后 \(CE\) 困惑了我和@wangyunbiao 好一阵子。
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define sort stable_sort
    #define endl '\n'
    string s;
    int main()
    {
    int n,i,flag=0,ans=0,sum=0,len;
    cin>>n;
    while(sum<n)
    {
    cin>>s;//cin貌似读不进空格 利用这个进行读入
    flag=0;
    len=s.size();
    if('A'<=s[0]&&s[0]<='Z')
    {
    flag=1;
    }
    for(i=0;i<=len-1;i++)
    {
    if(i>=1)
    {
    if('A'<=s[i]&&s[i]<='Z')//记得特判是否存在多个大写字母
    {
    flag=0;
    break;
    }
    }
    if('0'<=s[i]&&s[i]<='9')//如果有数字一定是不合法的
    {
    flag=0;
    break;
    }
    }
    if(flag==1)
    {
    ans++;
    }
    if(s[len-1]=='.'||s[len-1]=='?'||s[len-1]=='!')//如果到达末尾就输出
    {
    cout<<ans<<endl;
    ans=flag=0;
    sum++;
    }
    }
    return 0;
    }

T2 COCI 2016/2017 Round #3 Pohlepko \(6pts\)

  • 400w的string用来记录每条路径的结果可真有我的,成功 \(MLE\) 。
  • 分析样例,易知正方形对角线上的点横纵坐标之和相等,例如对角线②上的点横纵坐标之和为 \(2+1=1+2=3\) ,对角线③上的点横纵坐标之和为 \(3+1=2+2=1+3=4\) 。
  • 由 \((1,1)\) 到达 \((n,m)\) 易证需要经过 \(n+m-1\) 个点。
  • 考虑枚举第 \(i (2≤i≤n+m-1)\) 条对角线,遍历点 \((j,i-j+1)\) ,判断上个点( \((j-1,i-j+1) or (j,i-j)\) )是否可进行扩展,即能到达点 \((j,i-j+1)\) ,并于其中选出字典序最小的(如果有多个则都进行标记,直到找到相对唯一最小的或到达终点),标记这些位置是可进行扩展的。
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define sort stable_sort
    #define endl '\n'
    char a[2001][2001],minn;
    int vis[2001][2001];//vis[x][y]用来记录点(x,y)是否可以进行扩展
    int main()
    {
    int n,m,i,j,k;
    cin>>n>>m;
    for(i=1;i<=n;i++)
    {
    for(j=1;j<=m;j++)
    {
    cin>>a[i][j];
    }
    }
    cout<<a[1][1];
    vis[1][1]=1;
    for(i=2;i<=n+m-1;i++)//枚举对角线
    {
    minn='z';
    for(j=1;j<=n;j++)//枚举点
    {
    k=i+1-j;
    if(1<=k&&k<=m)//判断点是否合法
    {
    if(vis[j-1][k]==1)//找到最小值
    {
    minn=min(minn,a[j][k]);
    }
    if(vis[j][k-1]==1&&a[j][k]<minn)//找到最小值
    {
    minn=min(minn,a[j][k]);
    }
    }
    }
    cout<<minn;//输出最小字母
    for(j=1;j<=n;j++)
    {
    k=i+1-j;
    if(1<=k&&k<=m)
    {
    if(vis[j-1][k]==1&&a[j][k]==minn)//进行扩展
    {
    vis[j][k]=1;
    }
    if(vis[j][k-1]==1&&a[j][k]==minn)//进行扩展
    {
    vis[j][k]=1;
    }
    }
    }
    }
    return 0;
    }

T3 luogu P7535 [COCI2016-2017#4] Kas \(15pts\)

  • 发现这道题和学校oj上某年CSP-J模拟赛T2很像,不过那道题要求差值尽可能小,故令 \(sum=\sum\limits_{i=1}^{n} v[i]\) ,构建容量为 \(\frac{sum}{2}\) 的 \(01\) 背包,且每件物品的质量和价值相等(即 \(w[i]=v[i]\) )。但本题要求差值为 \(0\) 。
  • 考虑 \(DP\) ,令 \(f[i][j]\) 表示前 \(i\) 张钞票分给两人后满足差值为 \(j\) 的最大总金额(不用管如何分配,赛场上因为这个考虑太多所以祭了)。
    • 然后当遍历到第 \(i\) 张钞票进行分类讨论:

      • 第 \(i\) 张钞票两人都不给,此时有 \(f[i][j]=f[i-1][j]\) 。
      • 将第 \(i\) 张钞票给两人中金额少的那人,此时有 \(f[i][j]=max(f[i][j],f[i-1][j+a[i]]+a[i])\) 。
      • 将第 \(i\) 张钞票给两人中金额多的那人,此时有 \(f[i][j]=max(f[i][j],f[i-1][abs(j-a[i])]+a[i])\) 。
        • 注意是 \(abs(j-a[i])\) ,因为原来的差值可能是 \(j-a[i]\) ,也可能是 \(a[i]-j\) 。
    • 得到 \(DP\) 式子, \(f[i][j]=max\lbrace f[i-1][j],f[i-1][j+a[i]]+a[i],f[i-1][abs(j-a[i])]+a[i]\rbrace\) 。
      • 因为转移第一维时仅需要从上一维进行转移,可以加滚动数组优化,以此达到时间换空间的做法。
    • 代码
      //不加滚动数组
      #include<bits/stdc++.h>
      using namespace std;
      #define ll long long
      #define sort stable_sort
      #define endl '\n'
      int a[502],f[502][100002];
      int main()
      {
      int n,i,j,sum=0;
      cin>>n;
      memset(f,-0x3f,sizeof(f));//给f数组赋一个很小的值
      f[0][0]=0;
      for(i=1;i<=n;i++)
      {
      cin>>a[i];
      sum+=a[i];
      }
      for(i=1;i<=n;i++)
      {
      for(j=0;j<=sum;j++)
      {
      f[i][j]=max(f[i-1][j],max(f[i-1][j+a[i]]+a[i],f[i-1][abs(j-a[i])]+a[i]));
      }
      }
      cout<<sum-f[n][0]+f[n][0]/2;//(sum-f[n][0])*2/2+f[n][0]/2
      return 0;
      }
      //使用滚动数组
      #include<bits/stdc++.h>
      using namespace std;
      #define ll long long
      #define sort stable_sort
      #define endl '\n'
      int a[502],f[100002],g[100002];
      int main()
      {
      int n,i,j,sum=0;
      cin>>n;
      memset(f,-0x3f,sizeof(f));
      f[0]=0;
      for(i=1;i<=n;i++)
      {
      cin>>a[i];
      sum+=a[i];
      }
      for(i=1;i<=n;i++)
      {
      for(j=0;j<=sum;j++)
      {
      g[j]=max(f[j],max(f[j+a[i]]+a[i],f[abs(j-a[i])]+a[i]));//取一个g数组用来临时存储转移结果
      }
      for(j=0;j<=sum;j++)
      {
      f[j]=g[j];
      }
      }
      cout<<sum-f[0]+f[0]/2;
      return 0;
      }

T4 CF1301F Super Jaber \(10pts\)

  • 赛场上咕了,暴力建边,跑了一遍 \(Floyd\) ,骗了 \(10pts\) ,就去弄别的了。骗分代码
  • 题面翻译得不太好,包括但不限于“并排相邻”,明显机翻痕迹。
  • 考虑记录同种颜色的点的坐标,然后跑 \(BFS\) 处理多源最短路。
    • 把相同颜色的点看做一个传送门。
    • 令 \(dis[i][x][y]\) 表示以颜色为 \(i\) 的任意非 \((x,y)\) 点作为起点到达 \((x,y)\) 的最小距离,并开一个 \(vis\) 数组标记是否走过。
    • 接着跑 \(BFS\) 预处理,实现 \(O(1)\) 查询。
    • 时间复杂度 \(O(nm+nmk+qk)\) ,卡常代码(注释也在这里)
  • \(CF\) 上时限 \(5s\) ,不卡常代码跑到了 \(4.5s\) ,所以"略带"卡常,然后就手写了 \(queue\) ,加上了火车头和快读(请使用 C++11 或更高的版本编译), \(i++\) 改成了 \(++i\) ,尽量减少对数组的调用及变量重复定义消耗的时间,使用 \(bool\) 代替 \(int\) ,在主函数内使用 \(register \ int\) 。
    • 卡常跑进 \(0.96s\) 以内了,有更优卡常方法@我。
    • 代码(把快读快写部分删了)
      #include<bits/stdc++.h>
      using namespace std;
      #define ll long long
      #define sort stable_sort
      #define endl '\n'
      struct sx_queue//手写队列
      {
      int q[2000000],l=1,r=1;
      inline void push(int x){q[++r]=x;}
      inline int front(){return q[l+1];}
      inline void pop(){++l;}
      inline int back(){return q[r];}
      inline int size(){return r-l;}
      inline bool empty(){return l>=r;}
      };
      int main()
      {
      int n,m,k,q,nx,ny,r1,c1,r2,c2,ans,lsx,lsy,lsc,i,j;
      cin(n,m,k);
      for(i=1;i<=n;++i)
      {
      for(j=1;j<=m;++j)
      {
      cin(color[i][j]);
      ++sum[color[i][j]];
      x[color[i][j]].push_back(i);
      y[color[i][j]].push_back(j);
      }
      }
      for(i=1;i<=k;++i)
      {
      sx_queue qx,qy;
      memset(vis,false,sizeof(vis));
      vis[i]=true;
      for(j=0;j<sum[i];++j)
      {
      qx.push(x[i][j]);
      qy.push(y[i][j]);
      dis[i][x[i][j]][y[i][j]]=1;
      }
      while(!qx.empty())//跑一遍BFS
      {
      lsx=qx.front();
      qx.pop();
      lsy=qy.front();
      qy.pop();
      for(j=0;j<=3;++j)
      {
      nx=dir[j][0]+lsx;
      ny=dir[j][1]+lsy;
      if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&(!dis[i][nx][ny]))//这里用来处理颜色连通情况
      {
      qx.push(nx);
      qy.push(ny);
      dis[i][nx][ny]=dis[i][lsx][lsy]+1;
      }
      }
      lsc=color[lsx][lsy];
      if(!vis[lsc])
      {
      vis[lsc]=true;
      for(j=0;j<sum[lsc];++j)
      {
      if(!dis[i][x[lsc][j]][y[lsc][j]])
      {
      qx.push(x[lsc][j]);
      qy.push(y[lsc][j]);
      dis[i][x[lsc][j]][y[lsc][j]]=dis[i][lsx][lsy]+1;
      }
      }
      }
      }
      }
      cin(q);
      for(i=1;i<=q;++i)
      {
      cin(r1,c1,r2,c2);
      ans=abs(r2-r1)+abs(c2-c1);//如果不经过传送门,易知结果为两点的曼哈顿距离
      for(j=1;j<=k;++j)
      {
      ans=min(ans,dis[j][r1][c1]+dis[j][r2][c2]-1);//-1是因为重复计算一个点
      }
      cout(ans,'\n');
      }
      return 0;
      }

总结

看清语言再提交。

2023年多校联训NOIP层测试1的更多相关文章

  1. Contest1893 - 2019年6月多校联训b层测试1

    传送门 密码:waxadyt T1 暴力 对于任意相邻的两个值 中间能到达的最大高度是固定的 加上头尾,判一下就好了 代码//感谢Th Au K #include<bits/stdc++.h&g ...

  2. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  3. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  4. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  5. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  6. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

  7. 三校联训 【NOIP模拟】寻找

    题面 “我有个愿望,我希望穿越一切找到你.” 这是个二维平面世界,平面上有n个特殊的果实,我从(0,0)点出发,希望得到尽量多的果实,但是出于某种特殊的原因,我的运动方式只有三种(假设当前我在(x,y ...

  8. [考试反思]0714/0716,NOIP模拟测试3/4

    这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...

  9. [k8s]nginx-ingress配置4/7层测试

    基本原理 default-backend提供了2个功能: 1. 404报错页面 2. healthz页面 # Any image is permissable as long as: # 1. It ...

  10. 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】

    [题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...

随机推荐

  1. jQuery组织后续事件 事件冒泡 事件委托 键被按下 批量操作 hover input 事件

    1. jQuery绑定事件的方式 1. $('').click(function(){}) 2. $('').on('click', function(){}) 2. 阻止后续事件执行 1. retu ...

  2. spring启动流程 (2) Bean实例化流程

    本文通过阅读Spring源码,分析Bean实例化流程. Bean实例化入口 上一篇文章已经介绍,Bean实例化入口在AbstractApplicationContext类的finishBeanFact ...

  3. 【一文秒懂】Ftrace系统调试工具使用终极指南

    [一文秒懂]Ftrace系统调试工具使用终极指南 1.Ftrace是什么 Ftrace是Function Trace的简写,由 Steven Rostedt 开发的,从 2008 年发布的内核 2.6 ...

  4. JMS微服务开发示例(三)使用分布式锁和编写定时任务

    分布式锁 在Controller当中,提供了分布式锁的功能,代码如下: class HelloworldController : MicroServiceControllerBase { static ...

  5. [转帖]RHEL/CentOS 7中的网络暨network.service与NetworkManager.service详解

    在RHEL/CentOS 6及以前的版本中,网络功能是通过一系列网络相关的脚本文件实现,如/etc/init.d/network文件,及如下/sbin/if*文件等. [root@myserver ~ ...

  6. nexus的简单安装与使用

    nexus的简单安装与使用 文件下载 官网上面下载文件比较麻烦, 得科学一些 https://www.sonatype.com/download-oss-sonatype 选择oss 开源版进行下载 ...

  7. Mysql8.0.32 union all创建视图无法使用中文模糊查询的坑

    Mysql8.0.32 union all创建视图无法使用中文模糊查询的坑 摘要 本周研发同事反馈现场有一个问题. 客户使用mysql的数据库(Windows平台) 然后在多表union all 创建 ...

  8. [转帖]Java 平台调试体系

    https://www.cnblogs.com/xiaojiesir/p/15652619.html Java 平台调试体系(Java Platform Debugger Architecture,J ...

  9. dmidecode 查看内存以及硬件信息

    安装工具dmidecode 使用 1.查看内存槽及内存条 $ sudo dmidecode -t memory 2.查看内存的插槽数,已经使用多少插槽.每条内存多大 $ sudo dmidecode  ...

  10. vue3中context.emit遇见的坑

    场景描述 今天遇见一个问题 ,子组件向上抛出去的事件. 被执行了两次,原因是 context.emit('click', item.id) 你的事件名是click 将click更改为其他事件名称,就可 ...