awcing杯初赛3道题的讲解

本文介绍了如何进行十进制到十六进制的转换,通过模拟洒水器问题求解淹没时间,以及使用动态规划解决区间选择问题。涉及进制转换算法、模拟思考和dp技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一道题

 很简单,就是一个进制转换,把十进制数转换到16进制,并存储到一个string里,然后遍历一遍就行了;

这边要熟悉进制转换的算法;

且注意,当输入的数是0时,我们要特判一下;

其实进制转换就是看10进制数里面可以凑出多少个m次方数,m^0、m^1、m^2……【m为需要转换的进制】

#include<iostream>
#include<string>
using namespace std;

int n;
string a;
int cont;

int main(){
    
    cin>>n;
    
    if(n==0){//0的特判
        a+='0';
    }
    
    while(n){//如果是转m进制,那么我们就就将下面的16换成m即可
        
        int x=n%16;
        
        if(x<10) a+='0'+x;
        else a+=(x%10)+'A';
        n/=16;
    }
    //cout<<a<<endl;
    for(int i=0;i<a.size();i++){
        
        if(a[i]=='0'||a[i]=='4'||a[i]=='6'||a[i]=='9'||a[i]=='A'||a[i]=='D') cont++;
        else if(a[i]=='8'||a[i]=='B') cont+=2;
        
    }
    cout<<cont;
    
}

那么接下来就是第二题了,这道题相对上面的签到题还是有难度的,我们需要推理一下;

 所有的洒水器都是同时开的,且最后的时间点一定是最后的格子被淹没的时刻;

我们即所有相邻洒水器之间的距离为di【如果相邻某个方向没用洒水器,就记di为其于端点之间的距离】;

我们可以推断出来,总时间一定是最长的di被两端的洒水器一起淹没的时间,所以我们只需要记算每个区间被淹没的时间,然后取最大值即可,但是这里有特殊情况,端点与某一个洒水器之间的di只有一个洒水器从一端淹没,而其他的有两个洒水器一同工作;

#include<iostream>
#include<algorithm>
using namespace std;

const int N=100010;

int n,k,t;
int st[N];

int main(){
    
    cin>>t;
    
    while(t--){
        
        cin>>n>>k;
        
        for(int i=0;i<k;i++) cin>>st[i];
        
        int ans=0;

        ans=max(ans,(st[0]-1)+1);//特殊处理两个端点区间
        ans=max(ans,(n-st[k-1])+1);

        for(int i=1;i<k;i++){//寻找最大值
            
            int len=st[i]-st[i-1]-1;
            
            int t=len/2+1;
            if(len%2) t++;
            ans=max(ans,t);
            
        }
        cout<<ans<<endl;
        ans=0;
        
    }
    
}

那么接下来就是第三题了;

 这道题我刚开始以为是贪心,即每一次找一个最大的区间,循环k次,这个贪心的思路我没有证明是否可行,但实现难度有点大,所以就放弃贪心了,然后就想到dp去了,稍微一想一下,思路就出来了;

我们用集合的角度来理解这道题的dp;

(1)首先状态的定义我们很好想到,即f[i][j]为前j个数字选i个区间的全部集合;

(2)状态的属性:f[i][j]存储max值

(3)状态转移方程:找一下从上一个状态A到此刻的状态B的不同点在哪,然后通过这个不同点来找方程,很显然,从A->B的过程中多了一个数可以选择,且在区间的右端点,那么我们可以通过这个右端点的不同状态来划分f[i][j];【记右端点为M】

1:不选M,这个好想,即为f[i][j-1]的值

2:选M,因为区间是连续的,所以我们可以确认一个区间,记为被确认选的数构成的区间为Q【Q是连续的】,最大值即为f[i][q]+value【q为Q的右端点编号,value是确认区间的和】;

分析到这里就是给01背包了,属实对不起这道题的困难难度【这个本菜鸟第一道在acwing中写出来的困难等级……】;

下面是代码;

哦对了,因为我们要一个连续区间的总和,所以我们可以用前缀和优化;

#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;

const int N=5010;

ll f[N][N];//前i个范围,有j数
int n,m,k;
ll st[N];
ll fr[N];//前缀和数组

int main(){
    
    cin>>n>>m>>k;
    
    for(int i=1;i<=n;i++) cin>>st[i],fr[i]=fr[i-1]+st[i];
    
    for(int i=1;i<=k;i++){
        
        for(int j=1;j<=n;j++){
            
            if(j>=i*m){
                
                //不选
                f[i][j]=f[i][j-1];
                
                //选
                f[i][j]=max(f[i][j],f[i-1][j-m]+fr[j]-fr[j-m]);
                
            }
            
        }
        
    }
    
    cout<<f[k][n];
    
}

最后总结一下

1:进制转换

2:模拟

3:动态规划

内容概要:本文档《DeepSeek本地部署教程(非ollama)》详细介绍了DeepSeek大语言模型的本地部署流程。首先明确了环境要求,包括Python 3.8以上版本、CUDA 11.7(针对GPU用户)、至少16GB RAM以及推荐的操作系统。接着阐述了安装步骤,如克隆代码仓库、创建虚拟环境、安装依赖等。随后讲解了模型下载方式,支持从Hugging Face平台下载不同版本的DeepSeek模型,如DeepSeek-7B、DeepSeek-67B和DeepSeek-Coder。文档还提供了两种运行模型的方式:命令行运行和使用API服务。此外,针对常见的问,如CUDA相关错误、内存不足和模型加载失败等,给出了详细的解决方案。最后,文档提出了性能优化建议,如使用量化技术减少内存占用、启用CUDA优化等,并强调了安全注意事项,包括定期更新模型和依赖包、注意API访问权限控制等方面。; 适合人群:对大语言模型感兴趣的研究人员、开发者,特别是希望在本地环境中部署和测试DeepSeek模型的技术人员。; 使用场景及目标:①帮助用户在本地环境中成功部署DeepSeek大语言模型;②解决部署过程中可能遇到的问,如环境配置、模型下载和运行时的常见错误;③提供性能优化建议,确保模型在不同硬件条件下的最佳表现;④指导用户进行安全配置,保障模型和数据的安全性。; 阅读建议:在阅读本教程时,建议按照文档的步骤顺序逐步操作,同时结合实际情况调整环境配置和参数设置。对于遇到的问,可以参考常见问解决部分提供的解决方案。此外,性能优化部分的内容有助于提高模型的运行效率,值得深入研究。
Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目),该项目是个人大作业项目,答辩评审分达到98分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于S
内容概要:本文档详细介绍了基于JavaScript的俄罗斯方块游戏课程设计,旨在通过开发完整的俄罗斯方块游戏帮助学生掌握前端开发技术。课程设计分为课程背景与目标、项目意义、预期成果、需求分析、系统设计、详细设计、界面设计、实现方案、测试方案、项目进度安排以及总结与展望几个部分。系统设计采用模块化思想,包括游戏核心逻辑、界面渲染、用户交互和游戏状态管理四个主要模块。详细设计中定义了方块类、游戏类、渲染类和控制器类,明确了各组件的功能和交互方式。实现方案提供了HTML、CSS和JavaScript的具体代码示例,确保游戏在不同浏览器和设备上的兼容性。测试方案涵盖功能测试、边界测试、用户界面测试和兼容性测试,以保证游戏的质量。项目进度安排分为需求分析、编码实现、测试调试、文档编写和项目验收五个阶段,时间跨度约为11周。 适合人群:具备一定编程基础,特别是对JavaScript有一定了解的学生或初学者。 使用场景及目标:①巩固JavaScript基础知识,包括变量、函数、对象、数组、循环等;②理解并掌握DOM操作方法;③学习如何处理用户事件和实现交互效果;④掌握动画原理和实现方式;⑤培养解决实际问的能力和逻辑思维。 其他说明:此课程设计不仅注重代码编写,还强调需求分析和方案设计,建议学习者在实践中结合这些内容,调试代码并不断优化游戏体验。此外,文档还提出了未来的改进方向,如添加更多游戏模式、实现多人对战、增加音效和动画效果等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值