AtCoder Beginner Contest 344 (A~F)

比赛地址传送门

A - Spoiler

#include <bits/stdc++.h>
using namespace std;
int main()
{string line;cin>>line;int l=0,r=line.length()-1;while(line[l]!='|') l++;while(line[r]!='|') r--;for(int i=0;i<line.length();i++) {if(i<l||i>r) cout<<line[i];}return 0;
}

B - Delimiter

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{vector<ll> ans;int x;while(cin>>x) {ans.push_back(x);if(x==0) break;}reverse(ans.begin(),ans.end());for(auto temp: ans) {cout<<temp<<'\n';}return 0;
}

C - A+B+C

可以发现数据范围不大,可以将所有求和结果提前枚举放进集合里,每次查询就看看集合里面有没有这个数

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{ios::sync_with_stdio(false),cin.tie(0);int n,m,l;cin>>n;vector<ll> a(n);for(int i=0;i<n;i++) cin>>a[i];cin>>m;vector<ll> b(m);for(int i=0;i<m;i++) cin>>b[i];cin>>l;set<ll> c;for(int i=0;i<l;i++) {int x;cin>>x;for(int j=0;j<n;j++) {for(int k=0;k<m;k++) {c.insert(x+a[j]+b[k]);}}}int t;cin>>t;while(t--) {ll q;cin>>q;cout<<(c.count(q)?"Yes":"No")<<'\n';}return 0;
}

D - String Bags*

有点 是分组背包问题,考虑维护数组 dp[i][j] 表示第 i 组中选好了前 j 个字符的最小花费。那么对于每一组中的每个单词,枚举所有 k ∈ [ 0 , S . l e n g t h ) k ∈ [0, S.length) k[0,S.length) 看看这个单词是否能放在第 k 个位置,如果可以的话,那么 dp[i][j] = min(dp[i-1][k-1]+1)
可以用滚动数组优化空间

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int tlen,len,a;
string t;
bool cmp(string a,string b)
{return a.length()>b.length();
}
void solve(vector<int> &f)
{vector<int> temp(110,1e9);for(int j=1;j<=a;j++) {string word;cin>>word;len=word.length();for(int k=0;k<=tlen-len;k++) {if(t.substr(k,len)==word) {if(k==0) temp[len-1]=1;else temp[k+len-1]=min(temp[k+len-1],f[k-1]+1);}}}for(int k=0;k<=tlen;k++)f[k]=min(f[k],temp[k]);
}
int main()
{int n;cin>>t>>n;tlen=t.length();vector<int> f(110,1e9);for(int i=1;i<=n;i++) {cin>>a;solve(f);}if(f[tlen-1]==1e9) cout<<-1;else cout<<f[tlen-1]<<'\n';return 0;
}

E - Insert or Erase

典型链表问题,普通链表插入 O ( 1 ) O(1) O(1),查询 O ( n ) O(n) O(n),但本题中每个数组仅会出现一次,可以用 map 将查询操作变为 O ( l o g n ) O(logn) O(logn)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// int nex[200010],pre[200010];
map<int,int> nex,pre;
int _front=-1;
int main()
{ios::sync_with_stdio(false),cin.tie(0);int n;cin>>n;int last=-1;for(int i=1;i<=n;i++) {int x;cin>>x;nex[x]=-1,pre[x]=-1;if(_front==-1) _front=x;if(last!=-1) nex[last]=x;pre[x]=last;last=x;}int q;cin>>q;while(q--) {int op,x,y;cin>>op>>x;if(op==1) {cin>>y;nex[y]=nex[x];pre[y]=x;if(nex[x]!=-1) pre[nex[x]]=y;nex[x]=y;} else {int z=pre[x];if(nex[x]!=-1) pre[nex[x]]=z;if(z==-1) {pre[nex[x]]=-1;_front=nex[x];} else {nex[z]=nex[x];}}}while(_front!=-1) {cout<<_front<<' ';_front=nex[_front];}return 0;
}

F - Earn to Advance

乍一看很简单,直接bfs搜索即可,但是试了一下发现第二个样例就过不去,时间复杂度过高,于是又想到了 dp ,用 dp[i][j] 来简单维护到坐标 ( i , j ) (i,j) (i,j) 的最短花费,贪心的想如果钱不够就留下来挖宝,如果够了就出发,想一会就发现不对。

开摆!

又到了观摩大佬代码的时间~
大佬题解
因为充值一次的代价是相同的,那么选择充钱多的点来充钱一定是最优解。如果起点钱最多,那完全可以在起点充好钱一股气走到终点,如果中间有个点钱很多,那么我们可以在起点充钱充到足够支持我们走到那个钱更多的点。不难发现,假设我们选择充钱的点为 a 1 、 a 2 、 a 3 、 . . . a_1、 a_2、 a_3、 ... a1a2a3... 那么,当且仅当 M a 1 < M a 2 < M a 3 . . . M_{a_1} < M_{a_2} < M_{a_3} ... Ma1Ma2<Ma3... 时才是最优的(M是钱数),对于每个点 x,dp维护它能走到的所有比它钱多的点 y 的花费, 如果从 x 走向 y 的花费更小或者两者花费相同但是从 x 走钱更多,则用 x 点更新 y 点

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{ios::sync_with_stdio(false),cin.tie(0);int n;cin>>n;vector p(n,vector<int>(n));vector r(n,vector<int>(n-1));vector d(n-1,vector<int>(n));for(auto &i: p) {for(auto &j: i) {cin>>j;}}for(auto &i: r) {for(auto &j: i) {cin>>j;}}for(auto &i: d) {for(auto &j: i) {cin>>j;}}vector dp(n,vector<array<ll,2>>(n,{(ll)1e18,0}));dp[0][0]={0,0};for(int i=0;i<n;i++) {for(int j=0;j<n;j++) {vector dist(n,vector<ll>(n,1e18));dist[i][j]=0;for(int k=i;k<n;k++) {for(int l=j;l<n;l++) {if(k) dist[k][l]=min(dist[k][l],dist[k-1][l]+d[k-1][l]);if(l) dist[k][l]=min(dist[k][l],dist[k][l-1]+r[k][l-1]);}}for(int k=i;k<n;k++) {for(int l=j;l<n;l++) {if(k!=n-1&&l!=n-1&&p[k][l]<p[i][j]) continue;ll step=dp[i][j][0],money=dp[i][j][1];ll cost=max(0ll,(dist[k][l]-money+p[i][j]-1)/p[i][j]);ll _money=money+cost*p[i][j]-dist[k][l];ll _step=step+cost+(k-i)+(l-j);if(_step<dp[k][l][0]||_step==dp[k][l][0]&&_money>dp[k][l][1])dp[k][l]={_step,_money};}}}}cout<<dp[n-1][n-1][0]<<'\n';return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/735630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于stm32的流水灯设计

1基于stm32的流水灯设计[proteus仿真] 速度检测系统这个题目算是课程设计和毕业设计中常见的题目了&#xff0c;本期是一个基于51单片机的自行车测速系统设计 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&#xffe5;&#xff0c…

《领导的气场——8堂课讲透中国式领导智慧》读书笔记

整体感悟 个人感觉书籍比较偏说教、理论&#xff0c;没有看完。 现仅仅摘录自己“心有戚戚焉”的内容。 经典摘录 管理的本质是通过别人完成任务。有一百件事情&#xff0c;一个人都做了&#xff0c;那只能叫勤劳&#xff1b;有一百件事情&#xff0c;主事的人自己一件也不做&…

js 获取浏览器相关的宽高尺寸

window 屏幕 屏幕分辨率的高&#xff1a; window.screen.height 屏幕分辨率的宽&#xff1a; window.screen.width 屏幕可用工作区高度&#xff1a; window.screen.availHeight 屏幕可用工作区宽度&#xff1a; window.screen.availWidth document 网页 网页可见区域宽&#xf…

shell 查询json文件的某一行并 替换json 键值字符串右边的内容(使用jq工具)

在shell中处理JSON文件时&#xff0c;直接通过shell命令行工具&#xff08;如sed&#xff09;进行精确的键值替换可能会比较困难和复杂&#xff0c;因为JSON数据结构需要解析器来正确识别键值对。推荐使用专门处理JSON的工具&#xff0c;如jq。 假设你有一个简单的JSON文件dat…

C语言学习--练习4(二维数组)

目录 1.统计有序数组中的负数 2.矩阵对角线元素和 3.最富有客户的资产总量 4.托普利兹矩阵 5.矩阵中的幸运数 6.二进制矩阵中的特殊位置 7.岛屿的周长 1.统计有序数组中的负数 //直接遍历二维数组即可 int countNegatives(int** grid, int gridSize, int* gridColSize) …

京东面试官问我,你在catch块中写业务代码吗?

文章目录 面试题背景我的理解实际运用场景 面试题背景 京东二面&#xff0c;面试官主要考察软实力吧。问了几个问题&#xff1a; 你觉得什么样的代码是好代码&#xff1f;平时你是如何做系统稳定性建设的&#xff1f;你在catch块中写过业务代码吗&#xff1f; 本文主要是谈谈…

比特币普通地址、隔离见证(兼容)、隔离见证(原生)、Taproot 地址傻傻分不清楚

我们在使用比特币钱包的时候&#xff0c;可以看到各种地址类型&#xff1a;普通地址、隔离见证&#xff08;兼容&#xff09;、隔离见证&#xff08;原生&#xff09;、Taproot 地址。 看得我们一脸懵逼&#xff0c;为什么会有这么多种类型的地址&#xff1f; 它们之间都有什么…

选修-单片机作业第1/2次

第一次作业 第二次作业 1、51 系列单片机片内由哪几个部分组成&#xff1f;各个部件的最主要功能是什么&#xff1f; 51系列单片机的内部主要由以下几个部分组成&#xff0c;每个部件的主要功能如下&#xff1a; 1. **中央处理器&#xff08;CPU&#xff09;**&#xff1a;这是…

图片上传组件

el-upload图片上传 背景代码 背景 项目需要多张图片上传回显&#xff0c;图片上传后返回图片ID&#xff0c;不返回url&#xff0c;需要通过图片ID获取token然后再拼接成图片下载的URL。选择el-upload组件进行开发。 file-list&#xff1a;文件列表&#xff0c;上传下载都需要…

线程池的执行流程

线程池是一种常见的并发编程模式&#xff0c;用于管理和复用线程以执行异步任务。其执行流程通常包括以下步骤&#xff1a; 初始化线程池&#xff1a; 在使用线程池之前&#xff0c;首先需要初始化线程池。在初始化过程中&#xff0c;需要指定线程池的参数&#xff0c;如线程池…

018-VUE框架优点

VUE框架优点 一句话总结 vue 作为一款轻量级框架&#xff0c;门槛低&#xff0c;上手快&#xff0c;简单易学&#xff1b;vue 可以进行组件化开发&#xff0c;数据与结构相分离&#xff0c;使代码量减少&#xff0c;从而提升开发效率&#xff0c;易于理解&#xff1b;vue 最突出…

装windows11+centos双系统时遇到问题及解决方法

从u盘启动提示linpus lite has been blocked 首先下载iso镜像文件&#xff0c;制作u盘启动工具&#xff0c;进行启动&#xff0c;这里进入bios界面进行启动项选择后&#xff0c;虽然已经将usb作为首要启动值 却会出现上图所示被“block”情形 需要在bios界面security选项&…

【数理统计实验(四)】方差分析

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

【动态规划】代码随想录算法训练营第四十四天 |完全背包,518. 零钱兑换 II , 377. 组合总和 Ⅳ (待补充)

完全背包理论基础 完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和…

三、实战篇 优惠券秒杀

源码仓库地址&#xff1a;gitgitee.com:chuangchuang-liu/hm-dingping.git 1、全局唯一ID 数据库默认自增的存在的问题&#xff1a; id增长规律明显受单表数据量的限制 场景一分析&#xff1a;id如果增长规律归于明显&#xff0c;容易被用户或者商业对手猜测出一些敏感信息&…

QT画图功能

QT画图功能 每个QWidget都自带的功能&#xff0c;继承了QPainteDevice都可以使用QPainter来进行绘图。 画图需要调用paintEvent绘制事件&#xff0c;paintEvent事件时QWidget类自带的事件。 重写paintEvent事件。&#xff08;重写事件&#xff1a;如果父类有某个方法&#xff…

Spring Boot 面试题及答案整理,最新面试题

Spring Boot中的自动配置是如何工作的&#xff1f; Spring Boot的自动配置是其核心特性之一&#xff0c;它通过以下方式工作&#xff1a; 1、EnableAutoConfiguration注解&#xff1a; 这个注解告诉Spring Boot开始查找添加了Configuration注解的类&#xff0c;并自动配置它们…

Maven-基本概念

一、Maven是什么 Maven是一个项目管理的工具。根据许晓斌老师的《Maven实战》一书&#xff1a;它主要完成的工作包含三个方面&#xff1a;构建项目、依赖管理、项目信息管理。 二、构建项目 何为构建&#xff1f;在我们编写完代码后&#xff0c;我们会编译、测试、打包、部署…

vue,Promise备忘

网址 https://www.promisejs.org/ 记录 在Vue.js或者其他JavaScript项目中&#xff0c;Promise 是一种处理异步操作的标准机制&#xff0c;用于解决传统的回调地狱问题&#xff0c;提供了一种更优雅、链式调用的编程模型。Promise对象代表一个异步操作的结果&#xff0c;它可…

22.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-加载配置文件到分析工具界面

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;21.配置数据保存…