20171007离线赛总结

2023-11-01

考试时的思路:

第一题先循环水一个80分出来
 
第二题先水70分,再用倍增枚举每一个坦克对应的下一个坦克。
 
第三题直接上DFS,能拿多少拿多少。

题解:

第一题 S数

  这道题,我打了个表,然后用二分法来做,记录每个答案的位置,即可得解。但是最后时间不够了,我发现lower_bound用错了的时候只剩下4分钟了,匆忙修改,但还是没对,不过好在暴力分拿到了,看来先打暴力这个方法肯定没错。
  

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#define M 100086
#define FOR(i,a,b) for(int i=(a),i##_end_=(b);i<=i##_end_;++i)
#define DOR(i,a,b) for(int i=(a),i##_end_=(b);i>=i##_end_;--i)
using namespace std;
int sum[M];
void Init() {
    FOR(i,1,M-1) {
        int x=i;
        while(x) {
            sum[i]+=x%10;
            x/=10;
        }
    }
}
int n,m;
int A[]= {}//打表
void solve1() {
    Init();
    int ans=0;
    FOR(i,n,m) {
        long long x=i*i;
        int cnt=0;
        while(x) {
            cnt+=x%10;
            x/=10;
        }
        if(cnt==sum[i]*sum[i])ans++;
    }
    cout<<ans<<endl;
}
void solve2() {
    int x,y;
    y=lower_bound(A+1,A+sizeof(A)/4,m)-A-1;
    x=lower_bound(A+1,A+sizeof(A)/4,n)-A-1;
    cout<<y-x<<endl;
}
int main() {
    cin>>n>>m;
    if(m<=1e5)solve1();
    else solve2();
    solve2();
    return 0;
}

  
  这道题有没有更好的算法呢?
  显然有。
  首先我们分析一下最大的数也就是18个9,那么加起来也就是9*18,开个方也就在12左右,只要根据这个来DFS就可以了,还是非常简单的,就看这一点有没有想到。

第二题 黑客入侵

  这道题,首先暴力就70分,少了点儿,因此我就考虑到了看电视这道题,用同样的思路,每一个坦克所对应的下一辆坦克是固定的,因此只要用倍增法求出有多少辆坦克没被打到,就可以顺势求出有多少辆坦克被打了。这种算法,还真没人这么写过,虽然麻烦了点,但正确性显然啊,特别是熟练使用倍增之后,如同行云流水一般,刷刷刷代码就打完了。
  

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#define M 200050
#define FOR(i,a,b) for(int i=(a),i##_end_=(b);i<=i##_end_;++i)
#define DOR(i,a,b) for(int i=(a),i##_end_=(b);i>=i##_end_;--i)
using namespace std;
struct node {
    int pos,attack;
} A[M],B[M];
int ans=1e9;
bool mark[M];
int n;
int Fa[20][M];
void solve1() {
    DOR(i,n+1,1) {
        int cnt=n+1-i;
        memset(mark,0,sizeof(mark));
        DOR(j,i-1,1) {
            if(mark[j])continue;
            int x=A[j].pos-A[j].attack;
            DOR(k,j-1,1) {
                if(A[k].pos>=x) {
                    mark[k]=true;
                    cnt++;
                } else break;
            }
        }
        if(cnt<ans)ans=cnt;
    }
    cout<<ans<<endl;
}
int cnt[20][M];
void Init() {
    FOR(i,1,n)B[i]=A[n-i+1];
    FOR(i,1,n) {
        int x=B[i].pos-B[i].attack;
        FOR(j,i+1,n) {
            if(B[j].pos>=x)continue;
            Fa[0][i]=j;
            break;
        }
    }
    FOR(i,1,n)cnt[0][i]=1;
    FOR(j,1,19)FOR(i,1,n) {
        Fa[j][i]=Fa[j-1][Fa[j-1][i]];
        cnt[j][i]=cnt[j-1][i]+cnt[j-1][Fa[j-1][i]];
    }
}
void solve2() {
    Init();
    FOR(i,0,n-1) {
        int tmp=0;
        int t=i+1;
        FOR(j,0,19) {
            tmp+=cnt[j][t];
            t=Fa[j][t];
        }
        if(n-tmp<ans)ans=n-tmp;
    }
    cout<<ans<<endl;
}
int main() {
    cin>>n;
    FOR(i,1,n)scanf("%d%d",&A[i].pos,&A[i].attack);
    if(n<=2000)solve1();
    else solve2();
    return 0;
}

  其实其他的大佬的代码比我更精简,想法也不错,所以可以看一看zhowie大佬的博客以及YZK大佬的博客

第三题:炮兵

  这道题我DFS写错了,但是迷之水了40分,我也很无奈啊。
  错误示范:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
#define FOR(i,a,b) for(int i=(a),i##_end_=(b);i<=i##_end_;++i)
#define DOR(i,a,b) for(int i=(a),i##_end_=(b);i>=i##_end_;--i)
int n,m;
bool pic[120][20];
char s[20];
bool mark[120][20];
int ans=0;
bool tmp[120][20];
void dfs(int x,int y,int cnt) {
    if(cnt>ans)ans=cnt;
    FOR(i,1,n)FOR(j,1,m)tmp[i][j]=mark[i][j];
    FOR(i,1,n)FOR(j,1,m)if(!mark[i][j]) {
        int top=max(1,i-2);
        int tail=min(i+2,n);
        FOR(k,top,tail)mark[k][j]=true;
        int top1=max(1,j-2);
        int tail1=min(j+2,m);
        FOR(k,top1,tail1)mark[i][k]=true;
        dfs(i,j,cnt+1);
        FOR(k,top,tail)mark[k][j]=tmp[k][j];
        FOR(k,top1,tail1)mark[i][k]=tmp[i][k];
    }
}
int main() {
    cin>>n>>m;
    FOR(i,1,n) {
        scanf("%s",s+1);
        FOR(j,1,m)pic[i][j]=(s[j]=='H');
    }
    FOR(i,1,n)FOR(j,1,m)mark[i][j]=pic[i][j];
    dfs(0,0,0);
    cout<<ans<<endl;
    return 0;
}

  可以清楚地看到,在还原现场的时候,看上去好像没什么错,用tmp数组来维护原来的数组,但是,在往下dfs的时候,tmp数组又重新赋值了,导致tmp数组用了跟没用一样,这就解释了为什么我接下来造了一组100×10的数据,每个都是P,却3毫秒跑出来。但是,水了40分过来,这次可以说是侥幸,下次如果数据比较强的话,就没那么好的运气了,这点要注意,千万不能让暴力的分数也丢了。
  这道题的正解是状态压缩dp,每一个点只与前一个点,以及上面第二个点有关系,因此可以用dp[i][j][k]来表示前i行放完,第i-1行放坦克情况为j,第i行状态为k的情况,具体正解,请见YZK大佬的代码。
  

#include<iostream>
#include<cstdio>
#include"cstring"
#define M 105
#define FOR(i,a,b) for(register int i=(a),i##_end_=(b);i<=i##_end_;++i)
#define DOR(i,a,b) for(register int i=(a),i##_end_=(b);i>=i##_end_;--i)
using namespace std;
int pic[M][15];
int dp[M][65][65];
int flag[65];
char s[15];
void checkmax(int &a,int k) {
    if(a==-1 or a<k)a=k;
}
int cnt[M*10];
int n,m;
int t=0;
void create() {
    FOR(i,0,(1<<m)-1) {
        if(i&(i<<1))continue;
        if(i&(i<<2))continue;
        if(i&(i>>1))continue;
        if(i&(i>>2))continue;
        flag[++t]=i;
        FOR(j,0,m-1)if(i&(1<<j))cnt[i]++;
    }
}
int ShimaKZ[M];
int ans=0;
int main() {
    cin>>n>>m;
    create();
    memset(dp,-1,sizeof(dp));
    FOR(i,1,n) {
        scanf("%s",s+1);
        FOR(j,1,m)if(s[j]=='H')ShimaKZ[i]|=(1<<(m-j));
    }
    dp[0][1][1]=0;
    FOR(i,1,n)FOR(j,1,t)FOR(k,1,t) {
        if(flag[j]&flag[k])continue;
        if(not(~dp[i-1][j][k]))continue;
        FOR(l,1,t) {
            if(flag[j]&flag[l])continue;
            if(flag[k]&flag[l])continue;
            if(flag[l]&ShimaKZ[i])continue;
            checkmax(dp[i][k][l],dp[i-1][j][k]+cnt[flag[l]]);
        }
    }
    FOR(i,1,t)FOR(j,1,t)checkmax(ans,dp[n][i][j]);
    cout<<ans<<endl;
    return 0;
}

总结:

  这次考得一般吧,该水的分都水过来了,有些小问题还是要注意,还有一些解法要总结一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

20171007离线赛总结 的相关文章

  • PLC驱动伺服电机、步进电机共阳极接法-20230701

    由于工作需要 需要测试一台小型伺服电机是否好坏 记录一下接线方法 设备如下 信捷XDM 60T10 C PLC 安诺机器人 57AIM30一体化伺服电机 官网找了下技术手册 可以看到这是一款24V供电的小型伺服驱动器 供电可以用手头的这款P
  • 高通平台(8917/8937/8953...) secure boot 软件配置

    以下以8917平台为例 其他平台类似 找到对应配置文件即可 1 新建临时目录 mkdir tmp cd tmp 2 复制openssl文件到临时目录 cp LA UM LINUX android vendor qcom proprietar
  • Pytorch(GPU)详细安装教程

    如果你也是为了安装Pytorch的话 然后在安装CUDA时出现上述错误时 那么就有必要往下看了 我电脑小白 自己摸索安装 一点一点搜索 然后在我不断努力下终于安装成功 最近也是在学习深度学习 把自己安装软件过程中遇到的问题很大家分享一下 在
  • Apollo CyberRT编译问题‘Socket closed‘

    Apollo 编译问题 Socket closed apollo CyberRT编译错误 错误原因 解决方法 apollo CyberRT编译错误 Server terminated abruptly error code 14 error
  • Oracle函数 获得一个UUID

    通过Oracle函数返回一个UUID create or replace function F GET UUID p length in INT return varchar2 is Result varchar2 200 说明 返回一个指
  • GitHub入门教程

    一 注册GitHub账号 GitHub官网https github com 注册之后 登录注册的邮箱验证后注册完成 二 下载Git 有Mac Windows Linux版本的 下载地址 https git scm com downloads
  • js 提示crypto is not defined

    在使用python 调用js的时候 Crypto enc UTF8 parse 引用这个函数的时候提示这个模块没有 没定义 随即 npm install crypto 但是又报错 cryptois not found 换了一些源也没用 最后
  • r语言聚类分析_R语言ggtree画圆形的树状图展示聚类分析的结果

    今天的主要内容是实现下面这幅图 做完聚类分析通常可以选择 树形图来展示聚类分析的结果 之前公众号也分享过一篇文章 如果样本数不是很多 可以选择矩形的树状图 但是样本数如果比较多 比如今天一位公众号的读者留言说他有160多个样本 这样 矩形的
  • 微信小程序------联动选择器

    2019独角兽企业重金招聘Python工程师标准 gt gt gt picker 从底部弹起的滚动选择器 现支持五种选择器 通过mode来区分 分别是普通选择器 多列选择器 时间选择器 日期选择器 省市区选择器 默认是普通选择器 先来看看效
  • VM12+CentOS6.5+hadoop2.7.3 搭建hadoop完全分布式集群

    参考 http blog csdn net gamer gyt article details 51991893 一 安装VM 12 x 下载地址 链接 http pan baidu com s 1c2KA3gW密码 3r67 二 安装Ce
  • 移动端 - 搜索组件(suggest篇)

    这一篇博客是和 search input篇 衔接的 需要的可以看上文 移动端 搜索组件 search list篇 这里我们需要去封装这么一个组件 先说一下大致的方向 1 根据父组件传入的关键字数据发送请求获取后端数据 进行模板渲染 2 处理
  • Kettle中调用用户自定义的jar包

    在使用kettle过程中 有些功能是kettle不提供的 这样就需要想办法 不过kettle中的java代码可以解决大部分问题 下边就展示使用java代码组件调用自己编写的jar包的过程 1 创建java jar包 package test
  • GL分数阶微积分

    目录 预备公式 将积分和导数统一 p lt 0表示积分 p gt 0表示导数 整数阶和分数阶混合运算 分数阶和分数阶混合运算 预备公式 z
  • javascript的window.location方法

    Response Write 或 Response Write 退后操作 Response Write
  • 备案域名绑定服务器后 提示需要备案_小程序开发需要多少钱?

    现在越来越多的企业想通过微信小程序来宣传产品 为什么小程序那么火爆呢 奥晶科技为您解答 其优点不言而喻 1 小程序建设的成本比APP建设成本低 2 小程序能紧跟市场发展潮流 随时更新功能 3 小程序用户广泛 依托微信的亿万用户 接入方便 用

随机推荐

  • Linux下gdb调试工具的使用

    gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具 gdb主要完成四个方面的功能 1 启动你的程序 可以按照你的自定义的要求随心所欲的运行程序 2 可让被调试的程序在你所指定的调试的断点处停住 断点可以是条件表达式 3 当程序
  • 在ubantu下cmake与make命令的简单使用

    ubantu下简单的使用cmake与make的使用 Step 1 新建一个可执行程序 首先确保你已经安装了cmake 和 g 如果没有安装 就 sudo apt get install cmake g 然后准备一个工作空间 并准备一些素材
  • 当大模型不是问题时,如何应对 LLM 的工程化落地挑战?

    几个月前 在 Thoughtworks 的内部 AIGC 研讨会里 我们一直达成了一系列一致观点 诸如于 如果没有 开源模型 降低企业应用 LLM 的成本 那么 LLM 会很快消亡 所以 我们相信开源 LLM LoRA 微调会成为企业的一种
  • Java AES加密解密报错 “java.security.InvalidKeyException: Illegal key size”

    项目中正常都会用到AES加密解密的问题 因为有的时候来不及设置公钥私钥 搞不对称加密 这种对称加密相对来说是比较方便的一个加密方式 与Base64比 AES相对来说破解难度要更高一些 同样你也可以往里面加盐 参与加密加强密码安全程度 但是问
  • java里的ClassNotFoundException

    1 Caused by java lang ClassNotFoundException org springframework security oauth2 common util RandomValueStringGenerator
  • 把浏览器中的页面数据下载为pdf

    把浏览器中的页面数据下载为pdf 页面样子 https img blog csdnimg cn 7c0f58887b6c40fe8a7112800e9a8c93 png 下载后效果 只是内容不一致而已 样式差不多 文章目录 把浏览器中的页面
  • win10telnet配置和telnet用法

    Telnet协议 Telnet协议是TCP IP协议族中的一员 是Internet远程登录服务的标准协议和主要方式 它为用户提供了在本地计算机上完成远程主机工作的能力 在终端使用者的电脑上使用telnet程序 用它连接到服务器 终端使用者可
  • curl源码编译安装

    https curl haxx se download html 首先去curl官网下载对应版本 这里有个坑需要注意 如果下载的源码版本太高 编译是成功的 但是curl可执行文件访问https的时候还是会报各种奇怪的错误 所以我这里的做法是
  • No module named ‘typing_extensions‘

    No module named typing extensions 在运行程序时出现如下报错 解决方法 在运行程序时出现如下报错 File E Anaconda install Dic envs python38 lib site pack
  • nginx try_files用法 及Nginx location的一些配置

    实例 Yii2推荐ngnix try files配置 location try files uri uri index html args 找指定路径下文件 如果不存在 则转给哪个文件执行 try files 语法 try files fi
  • Java 内存模型(JMM),一看就懂 清晰明了

    一 线程私有的内存区域 1 程序计数器 当前线程所执行的字节码的行号指示器 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令 它是程序控制流的指示器 2 虚拟机栈 线程调用 Java 方法时 每个方法每次调用都会
  • 基于形状的模板匹配来寻找稍微变形的图像

    方案 直接用整幅图像做模板匹配 下面是过程 原图 创建模板 下图是模板的轮廓 需要识别的图像 识别结果 代码 dev update off read image ModelImage food cocoa package model dev
  • Java 运行jar包变更配置文件与变量

    文章目录 前言 实现原理 不同环境的配置文件 变更配置变量 前言 为实现快速搭建和开发 项目以Springboot框架搭建 springboot搭建的项目可以将项目直接打成jar包并运行 无需自己安装配置Tomcat或者其他服务器 是一种方
  • 李宏毅2023机器学习作业HW03解析和代码分享

    ML2023Spring HW3 相关信息 课程主页 课程视频 Kaggle link Sample code HW03 视频 HW03 PDF 个人完整代码分享 GitHub Gitee GitCode P S 即便 kaggle 上的时
  • 我的C++学习日志

    安装Mac上的C 编辑器 clang cmake 安装方法 Xnode shell 编译 方法 在Mac上设置iTerm 设置方法 写出第一个 Hello World 的程序 学习计划 听youtube视频 阅读c primer
  • s5pv210-uboot移植前言

    最近找工作 买了块飞凌的ok210 使用s5pv210的开发板 但是最重要的nandflash居然不开源 很恼火 于是想从头自己在这个板子上开发 计划这个工作做两年 看看两年的业余时间到底能够搞出点什么东西出来 感觉难度应该很大 但是应该可
  • JDK17遇到报错 module java.base does not “opens java.util“ to unnamed module 问题解决

    在Java 9及以上版本运行应用程序时 在各种情况下都会发生此异常 详细可以参考 module java base does not opens java lang to unnamed module 滔天蟹 博客园 https www c
  • SpringSecurity学习笔记(四)注销登录、获取用户数据

    参考视频 编程不良人 注销登录 默认情况下 如果我们已经登录了 然后get方式访问 logout接口就会注销登录 下次再访问受限资源就会提示我们重新登录 我们可以在ss过滤器的配置里面添加下面的配置 and logout logoutUrl
  • tensorflow 运行时候遇到 Error in `python': double free or corruption (fasttop)

    参考https github com tensorflow tensorflow issues 6968 我是用pip install no binary all force reinstall numpy 解决的
  • 20171007离线赛总结

    考试时的思路 第一题先循环水一个80分出来 第二题先水70分 再用倍增枚举每一个坦克对应的下一个坦克 第三题直接上DFS 能拿多少拿多少 题解 第一题 S数 这道题 我打了个表 然后用二分法来做 记录每个答案的位置 即可得解 但是最后时间不