AtCoder Beginner Contest 404 A-E 题解

在这里插入图片描述

还是ABC好打~比ARC好打多了(

题解部分

A - Not Found

给定你一个长度最大25的字符串,任意输出一个未出现过的小写字母

签到题,map或者数组下标查询一下就好

#include<bits/stdc++.h>using namespace std;#define int long long
#define lowbit(x) x&(-x)const int MOD=1e9+7;
const int N=1000100;int a[N];void solve() {init();string s;cin>>s;map<char,int>mp;int len = s.length();for(int i=0;i<len;i++) {mp[s[i]]=1;}for(int i=0;i<26;i++) {if(!mp[(char)('a'+i)]) {cout<<(char)('a'+i);return ;}}
}signed main() {//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//cout<<prime[cnt-1]<<"\n";//for(int i=1;i<=cnt;i++) cout<<prime[i]<<"\n";int t=1;//cin>>t;while(t--) {solve();}return 0;
}

B - Grid Rotation

给定两个二维字符数组,你能进行两种操作:将第一个字符数组顺时针旋转90度或者将第一个字符数组任意位置改为任意字符,问你最少需要多少次操作能将第一个字符数组变成第二个字符数组

纯模拟题,单独封装一个函数用于数组的旋转即可(不会有人真的手动写完旋转后的数组吧)

代码如下:

#include<bits/stdc++.h>using namespace std;#define int long long
#define lowbit(x) x&(-x)const int MOD=1e9+7;
const int N=1000100;int a[N];char b[110][110];
char c[110][110];
char t[110][110];int n;int minvalue = MOD;void rev() {for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++) {c[i][j] = b[n-j+1][i];}}for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++)b[i][j] = c[i][j];}
}void solve() {init();cin>>n;for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++) cin>>b[i][j];}for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++) cin>>t[i][j];}for(int i=1;i<=4;i++) {int sum=0;for(int j=1;j<=n;j++) {for(int k=1;k<=n;k++) {if(b[j][k] != t[j][k]) sum++;}}//cout<<sum<<"\n";minvalue = min(minvalue,sum + i - 1);rev();}cout<<minvalue<<"\n";
}signed main() {//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//cout<<prime[cnt-1]<<"\n";//for(int i=1;i<=cnt;i++) cout<<prime[i]<<"\n";int t=1;//cin>>t;while(t--) {solve();}return 0;
}

C - Cycle Graph?

给定你n个节点m条边,问你这个图是否有且仅有一条连接所有节点的欧拉回路

很简单,只要满足有n条边,每个点都是联通的并且每个点都有两条边就行

代码如下:

#include<bits/stdc++.h>using namespace std;#define int long long
#define lowbit(x) x&(-x)const int MOD=1e9+7;
const int N=1000100;void init() {}mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int Base = uniform_int_distribution<>(8e8,9e8)(rng);int a[N];vector<int>G[N];
int num;
int vis[N];void dfs(int t){vis[t]=1;num++;for(int i=0;i<G[t].size();i++) {int son = G[t][i];if(!vis[son]) {dfs(son);}}if(G[t].size() != 2) num = MOD;
}void solve() {init();int n,m;cin>>n>>m;for(int i=1;i<=m;i++) {int u,v;cin>>u>>v;G[u].push_back(v);G[v].push_back(u);}if(m != n) {cout<<"No\n";return ;}dfs(1);if(num != n) cout <<"No\n";else cout<<"Yes\n";
}signed main() {//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//cout<<prime[cnt-1]<<"\n";//for(int i=1;i<=cnt;i++) cout<<prime[i]<<"\n";int t=1;//cin>>t;while(t--) {solve();}return 0;
}

D - Goin’ to the Zoo

有n个动物园以及m个动物,告诉你每个动物在哪些动物园都有,每次去第i个动物园都需要支付 C i C_i Ci元,多次去同一个动物园看同一个动物视为看了某个动物多次,问你最少需要多少元能够满足每个动物至少都看了两次

刚开始我只想着简单的做法,所以小卡了一手这个地方,后面看范围越看越感觉能暴力。仔细一算,3的10次方大概1e4,完全可以直接爆搜,然后就用爆搜的做法过了

由于每个动物只需要看两次,也就是说我最多去同一个动物园两次,所以我只需要暴力搜索去某个动物园2次,1次,0次的情况就好

代码如下:

#include<bits/stdc++.h>using namespace std;
#define int long long 
const int N=1000100;
const int MOD=1e9+7;
vector<int>G[N];
vector<int>H[N];
int vis[N];
int n,m;
int minvalue = 20 * MOD;
int cost;
int a[N];void dfs(int t)
{//cout<<t<<"||"<<cost<<"\n";if(t == n+1){int sign=1;for(int i=1;i<=m;i++){if(vis[i] < 2){sign = 0;break;}}if(sign) minvalue = min(minvalue,cost);return ;}//去两次动物园的情况 for(int i=0;i<G[t].size();i++){int v = G[t][i];vis[v]+=2;}cost += a[t] * 2;dfs(t+1);cost -= a[t];//去一次动物园的情况 for(int i=0;i<G[t].size();i++){int v = G[t][i];vis[v]--;}dfs(t+1);cost -= a[t];//去零次动物园的情况 for(int i=0;i<G[t].size();i++){int v = G[t][i];vis[v]--;}dfs(t+1);
}void solve()
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];map< pair<int,int> , int>mp;for(int i=1;i<=m;i++){int num;cin>>num;for(int j=1;j<=num;j++){int v;cin>>v;if(!mp[{v,i}]) G[v].push_back(i),mp[{v,i}]=1;}}//	for(int i=1;i<=n;i++)
//	{
//		for(int j=0;j<G[i].size();j++) cout<<G[i][j]<<" ";
//		cout<<"\n";
//	}dfs(1);cout<<minvalue;
}signed main()
{int t=1;while(t--){solve();}return 0;
}

E - Bowls and Beans

给你n个碗,每个碗都有一个对应的 C i C_i Ci,初始时候每个碗里面都有 a i a_i ai个豆,每次操作你都可以将某个碗里面豆移动到这个碗左边 C i C_i Ci个碗中,问你最少需要多少次操作能够将所有豆移动到第一个碗里面

关于这道题我们需要理清一下思绪,首先先看某一个豆移动到第一个碗的操作,我每次遍历我当前能够到达的范围范围1,然后再遍历这个范围1,找到这个范围里面每个碗能够移动的最左边得到范围2,然后再让范围1扩张为范围2,重复操作,我所进行的操作次数就是只看这一个豆的情况下所需要的操作次数

那可能就有人要问了,为什么不是bfs去找层次呢,所以接下来就是重点,当我多个豆到达同一个碗,接下来我只需要一次操作就能将这些豆移走,也就是说我知道多个豆在哪个位置进入同一个碗,这是bfs难以做到的一点

考虑到以上这一点,我们不难得知一点:当左边的豆已经找到最短移动到第一个碗的时候,对于当前这个豆,我们只需要用最少的操作次数移动到前面已经找到最短移动路径即可

那么我们代码部分应该如何打呢,那我们就需要从左边开始遍历,当这个碗里面有豆的时候,我们不断重复前面提到的只看某一个豆的移动,一直重复到我可以移动到第一个碗或者是已经找到最短路径的碗即可

代码如下:

#include<bits/stdc++.h>using namespace std;#define int long long
#define lowbit(x) x&(-x)const int MOD=1e9+7;
const int N=1000100;mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int Base = uniform_int_distribution<>(8e8,9e8)(rng);int a[N];
int c[N];void solve() {init();int n;cin>>n;for(int i=1;i<=n-1;i++) cin>>c[i];for(int i=1;i<=n-1;i++) cin>>a[i];int res=0;int pre=0;for(int i=1;i<=n;i++) {if(a[i]) {int left = i,right=i;while(left > pre) {res ++;int nxtleft=left;for(int j=left;j<=right;j++) {nxtleft = min(nxtleft,j - c[j]);}left = nxtleft;}pre = i;}}cout<<res<<"\n";
}signed main() {//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//cout<<prime[cnt-1]<<"\n";//for(int i=1;i<=cnt;i++) cout<<prime[i]<<"\n";int t=1;//cin>>t;while(t--) {solve();}return 0;
}

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

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

相关文章

trae ai编程工具

Trae&#xff0c;致力于成为真正的 AI 工程师&#xff08;The Real Al Engineer&#xff09;。Trae 旗下的 AI IDE 产品&#xff0c;以智能生产力为核心&#xff0c;无缝融入你的开发流程&#xff0c;与你默契配合&#xff0c;更高质量、高效率完成每一个任务。 版本差异 国内…

Web 架构之前后端分离

文章目录 思维导图一、引言二、前后端分离的概念代码示例&#xff08;简单的前后端分离交互&#xff09;后端&#xff08;使用 Python Flask 框架&#xff09;前端&#xff08;使用 JavaScript 和 jQuery&#xff09; 三、前后端分离的优势3.1 提高开发效率3.2 代码可维护性增强…

理解 Elasticsearch 的评分机制和 Explain API

作者&#xff1a;来自 Elastic Kofi Bartlett 深入了解 Elasticsearch 的评分机制并探索 Explain API。 想获得 Elastic 认证吗&#xff1f;查看下一期 Elasticsearch Engineer 培训的时间&#xff01; Elasticsearch 拥有大量新功能&#xff0c;帮助你为你的使用场景构建最佳…

Jupyter Notebook / Lab 疑难杂症记:从命令找不到到环境冲突与网络阻塞的排查实录

Jupyter Notebook / Lab 疑难杂症记&#xff1a;从命令找不到到环境冲突与网络阻塞的排查实录 摘要&#xff1a; 本文记录了一次复杂的 Jupyter Notebook / Lab 故障排查过程。从最初的“command not found”错误出发&#xff0c;我们深入挖掘了可执行文件存在的矛盾、conda 环…

C++之set和map的运用

目录 序列式容器和关联式容器 熟识set 在STL中的底层结构&#xff1a; set的构造和迭代器 set的增删查 multiset和set的差异 练习题&#xff1a; 熟识map map类的介绍 pair类型介绍 map的构造 map的增删查 map的数据修改 测试样例&#xff1a; multimap和map的差…

【Bluedroid】蓝牙 SDP(服务发现协议)模块代码解析与流程梳理

本文深入剖析Bluedroid蓝牙协议栈中 SDP&#xff08;服务发现协议&#xff09;服务记录的全生命周期管理流程&#xff0c;涵盖初始化、记录创建、服务搜索、记录删除等核心环节。通过解析代码逻辑与数据结构&#xff0c;揭示各模块间的协作机制&#xff0c;包括线程安全设计、回…

【实战项目】简易版的 QQ 音乐:一

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能自我实现简易版的 QQ 音乐。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a…

Linux_进程退出与进程等待

一、进程退出 ‌退出场景‌ ‌正常终止‌&#xff1a;代码执行完毕且结果符合预期&#xff08;退出码为 0&#xff09;。‌异常终止‌&#xff1a;运行结果错误&#xff08;退出码非 0&#xff09;或进程被信号强制终止。&#xff08;如 SIGINT 或 SIGSEGV&#xff09;。 ‌退…

GD32F407单片机开发入门(二十八)USB口介绍及CDC类虚拟串口通讯详解及源码

文章目录 一.概要二.USB2.0基本介绍及虚拟串口介绍三.GD32单片机USB模块框图四.GD32单片机USB设备模式五.GD32F407VET6 USB设备CDC类六.配置一个USB虚拟串口收发例程七.工程源代码下载八.小结 一.概要 GD32F407VET6USB虚拟串口是一种采用GD32F407VET6单片机&#xff0c;通过US…

MySQL 主从配置超详细教程

文章目录 前言一、安装 MySQL二、主服务器&#xff08;Master&#xff09;配置三、从服务器&#xff08;Slave&#xff09;配置四、测试主从复制五、注意事项 前言 MySQL 主从配置是一种实用的数据库架构&#xff0c;主服务器处理写入操作&#xff0c;从服务器负责只读操作&am…

Python爬虫实战:获取百度学术专题文献数据并分析,为读者课题研究做参考

一、引言 在信息爆炸的当下,学术研究需要大量相关资料支撑。百度学术作为重要学术资源平台,蕴含丰富学术文献。利用爬虫技术获取百度学术特定主题文章数据,能为学术研究提供全面、及时信息。本研究旨在用 Python 实现对百度学术 “主题爬虫” 相关文章的爬取,并对数据深入…

手撕基于AMQP协议的简易消息队列-6(服务端模块的编写)

在MQServer中编写服务端模块代码 在MQServer中编写makefile文件来编译服务端模块 .PHONY: server CFLAG -I../ThirdLib/lib/include LFLAG -L../ThirdLib/lib/lib -lgtest -lprotobuf -lsqlite3 -pthread -lmuduo_net -lmuduo_base -lz server:server.cpp ../MQCommon/messag…

linux tar命令详解。压缩格式对比

1.压缩格式对比 压缩格式命令选项文件扩展名压缩率速度无压缩-cvf.tar无最快gzip-czvf.tar.gz中等较快bzip2-cjvf.tar.bz2较高较慢xz-cJvf.tar.xz最高最慢 9. 更多参考 【Linux基础】文件压缩tar命令指南tar压缩方式对比

解锁跨平台开发的新时代——Compose Multiplatform

解锁跨平台开发的新时代——Compose Multiplatform 在当今移动和桌面应用程序开发领域,跨平台解决方案是开发者们梦寐以求的工具。而由JetBrains打造的Compose Multiplatform正是这样一款现代UI框架,它基于Kotlin技术,为开发者构建高性能且美观的用户界面提供了极大的便利和…

【算法学习】递归、搜索与回溯算法(二)

算法学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言&#xff1a; 在&#xff08;一&#xff09;中我们挑了几个经典例题&#xff0c;已经对递归、搜索与回溯算法进行了初步讲解&#xff0c;今天我们来进一步讲解…

HTTP请求与缓存、页面渲染全流程

文章目录 前言**1. HTTP请求与缓存处理****缓存机制**• 强缓存&#xff08;Cache-Control / Expires&#xff09;• 协商缓存&#xff08;Last-Modified / ETag&#xff09; **2. 服务器响应与数据解析****3. HTML DOM 构建****4. CSSOM 构建****5. 渲染树&#xff08;Render …

限流算法学习笔记(一)Go Rate Limiter

文章目录 1. 背景与概述1.1 什么是速率限制1.2 Go Rate Limiter 的定义与价值 2. 核心思想与设计理念2.1 令牌桶算法的基本原理2.2 惰性评估设计2.3 多种处理策略的平衡2.4 简单易用的偶发控制 3. 架构设计与组件3.1 整体架构3.2 Limiter 组件3.3 Reservation 组件3.4 Limit 类…

n8n工作流自动化平台的实操:生成统计图的两种方式

1.成果展示 1.1n8n的工作流 牵涉节点&#xff1a;Postgres、Code、QuickChart、Edit Fields、HTTP Request 12.显示效果 2.实操过程 2.1节点说明 2.1.1Postgres节点&#xff1a; 注&#xff1a;将明细数据进行汇总。 2.1.2code节点&#xff1a; 注&#xff1a;将 查询的数…

JavaScript中数组和对象不同遍历方法的顺序规则

在JavaScript中&#xff0c;不同遍历方法的顺序规则和适用场景存在显著差异。以下是主要方法的遍历顺序总结&#xff1a; 一、数组遍历方法 for循环 • 严格按数组索引顺序遍历&#xff08;0 → length-1&#xff09; • 支持break和continue中断循环 • 性能最优&#xff0c;…

缓存(1):三级缓存

三级缓存是指什么 我们常说的三级缓存如下&#xff1a; CPU三级缓存Spring三级缓存应用架构&#xff08;JVM、分布式缓存、db&#xff09;三级缓存 CPU 基本概念 CPU 的访问速度每 18 个月就会翻 倍&#xff0c;相当于每年增⻓ 60% 左右&#xff0c;内存的速度当然也会不断…