AtCoder Beginner Contest 358 - VP记录

news/2024/11/8 21:45:27/文章来源:https://www.cnblogs.com/jerrycyx/p/18535939

Preface

这次的动规题真的多,起码有三道都是。

赛时做完 ABCD 以后就去攻 G 去了,可惜犯了煞笔错误搞 WA 了。

赛后补 F 的时候思路代码啥的都挺顺的(没看题解独立切的蓝题),就是犯了更煞笔的错误,成消愁🤡了(详见下方 F 题处),不然可以一个小时切了的。

总而言之,读题(特别是输入输出格式)一定要仔细,查半天查不出 Hack 数据的时候检查一下题意是否理解正确,输入输出是否符合题意。

A - Welcome to AtCoder Land

本场比赛主角:AtCoder Land。

点击查看代码
#include<cstdio>
#include<cstring>
using namespace std;const int N=15;
char s[N],t[N];int main()
{scanf("%s%s",s,t);if(!strcmp(s,"AtCoder")&&!strcmp(t,"Land")) printf("Yes\n");else printf("No\n");return 0;
}

B - Ticket Counter

点击查看代码
#include<cstdio>
#include<algorithm>
using namespace std;const int N=105;
int n,t,a[N];int main()
{scanf("%d%d",&n,&t);int ti=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);ti=max(ti,a[i])+t;printf("%d\n",ti);}return 0;
}

C - Popcorn

Pop+Corn=****

——xyz

据说我是最优解(时间全是 \(0\) ms),其实就是状态压缩位运算加了点速而已,本质还是暴力。

点击查看代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const int N=15;
int n,m; char str[N];
int bt[N],now;int main()
{scanf("%d%d",&n,&m);for(int i=0;i<n;i++){scanf("%s",str);for(int j=0;j<m;j++)if(str[j]=='o') bt[i]|=1<<j;}int ans=0x3f3f3f3f;for(int z=0;z<1<<n;z++){int now=0,cnt=0;for(int i=0;i<n;i++)if(z>>i&1) now|=bt[i],cnt++;if(now==(1<<m)-1) ans=min(ans,cnt);}printf("%d\n",ans);return 0;
}

D - Souvenirs

贪心,每次找距离 \(b_i\) 最近且大于等于它的 \(a\),可以用二分(可以 lower_bound)。

\(a\) 需要排个序,别问我为什么,问就是试出来的。

点击查看代码
#include<cstdio>
#include<algorithm>
using namespace std;const int N=2e5+5,M=2e5+5;
int n,m,a[N],b[M];
long long ans;int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=m;i++) scanf("%d",&b[i]);sort(a+1,a+n+1); sort(b+1,b+m+1);bool have_sol=true;for(int i=1;i<=m;i++){int p=lower_bound(a+1,a+n+1,b[i])-a;if(p==n+1){have_sol=false;break;}ans+=a[p],a[p]=0;}if(have_sol) printf("%lld\n",ans);else printf("-1\n");return 0;
}

E - Alphabet Tiles

差评,难度不够均匀,这次都没有黄题,直接橙跳绿了。

动态规划,两下就推出了所有的状态表示和转移方程,可惜代码里循环范围搞错了(具体位置见代码注释,这么写的原因也在注释里)。

赛后看了题解才知道错哪里,思路和这篇题解相似。

#include<cstdio>
#include<algorithm>
using namespace std;const int N=1005,M=30,P=998244353;
int n,c[M];
int f[M][N],C[N][N];int main()
{scanf("%d",&n);C[0][0]=1;for(int i=1;i<=n;i++)for(int j=0;j<=i;j++)C[i][j]=j?(C[i-1][j]+C[i-1][j-1])%P:1;for(int i=1;i<=26;i++)scanf("%d",&c[i]);f[0][0]=1;for(int i=1;i<=26;i++){for(int j=0;j<=n;j++){/** j需要从0开始,这样可以使f[i][0]均等于1* 然后在计算的时候,就可以计算到单字符组成的串及其衍生* 否则,只有f[0][0]=1,这样最初只有串"A"被计入方案* 后续所有字符串都是在单字符'A'上进行修改得到的,方案就不全面 */for(int k=0;k<=min(j,c[i]);k++)f[i][j]=(f[i][j]+1ll*C[j][k]*f[i-1][j-k])%P;printf("%d ",f[i][j]);}putchar('\n');}int ans=0;for(int i=1;i<=n;i++)ans=(ans+f[26][i])%P;printf("%d\n",ans);return 0;
}

F - Easiest Maze

全体目光,向我看齐,我宣布个事,我是个傻逼!!!

发疯完毕,有解时没有输出 Yes 血调一个半小时,最后发现我是 Joker🤡。

最后补的一道题,基础思路为先构造出一条从起点到终点的直线路径,然后再逐步拉伸变长。

构造部分我是先生成的行走方向序列,再根据这个方向序列生成迷宫。

回头有空在洛谷上发一篇题解。

#include<cstdio>
using namespace std;const int N=105,M=105;
int n,m,k;char dir[N][M];
void Build_dir()
{for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)dir[i][j]='-';for(int i=1;i<=n;i++)dir[i][m]='D';int rest=k-n;for(int i=1;i+1<=n;i+=2){if(!rest) break;for(int j=m-1;j>=1;j--){if(!rest) break;dir[i][j+1]='L';dir[i][j]='D';dir[i+1][j]='R';rest-=2;}}for(int i=1;i<=m;i+=2){if(!rest) break;dir[n-1][i]='D';dir[n][i]='R';dir[n][i+1]='U';rest-=2;}return;
}char ans[N<<1][M<<1];
void Solve()
{Build_dir();for(int i=1;i<=(n<<1|1);i++)ans[i][1]=ans[i][m<<1|1]='+';for(int i=1;i<=(m<<1|1);i++)ans[1][i]=ans[n<<1|1][i]='+';ans[1][m<<1]='S',ans[n<<1|1][m<<1]='G';for(int i=1;i<=(n<<1|1);i+=2)for(int j=1;j<=(m<<1|1);j+=2)ans[i][j]='+';for(int i=2;i<(n<<1|1);i+=2)for(int j=2;j<(m<<1|1);j+=2)ans[i][j]='o';for(int i=3;i<(n<<1|1);i+=2)for(int j=2;j<(m<<1|1);j+=2){int x=(i-1)>>1,y=j>>1;if(dir[x][y]=='D'||dir[x+1][y]=='U')ans[i][j]='.';else ans[i][j]='-';}for(int i=2;i<(n<<1|1);i+=2)for(int j=3;j<(m<<1|1);j+=2){int x=i>>1,y=(j-1)>>1;if(dir[x][y]=='R'||dir[x][y+1]=='L')ans[i][j]='.';else ans[i][j]='|';}printf("Yes\n");for(int i=1;i<=(n<<1|1);i++){for(int j=1;j<=(m<<1|1);j++)putchar(ans[i][j]);putchar('\n');}return;
}bool check()
{if((n&1)!=(k&1)) return false;int maxpath=n*m;if((n&1)&&!(m&1)) maxpath--;if(k>maxpath||k<n) return false;return true;
}
int main()
{scanf("%d%d%d",&n,&m,&k);if(check()) Solve();else printf("No\n");return 0;
}

G - AtCoder Tour

赛时主攻的题,可惜最长路没有初始化为 -INF 而是 0 导致挂了。

最优策略一定是一路走到某个位置,然后一直待到结束,证明可以参考洛谷题解。

建立分层图,\(f_{lv,x,y}\) 表示第 \(lv\) 步走到坐标 \((x,y)\) 能获得的最大积分。答案为:

\[\max\{ f_{lv,x,y}+(k-lv) \times a_{i,j} \} \]

每次从一层向更高层更新最长路,注意如果不初始化为极小值(比如 \(-10^{18}\) 之类的),可能会导致求得的答案不是以题目所要求为起点。

同时也不可以按照常规 DP 找四个方向的最大积分,因为最长路可能会绕着弯走(但是不会形成环)。

#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;const int N=55,M=55,K=2505;
int n,m,k,sx,sy;
long long a[N][M];
long long f[K][N][M],ans;const int dx[5]={0,1,-1,0,0};
const int dy[5]={0,0,0,1,-1};int main()
{scanf("%d%d%d",&n,&m,&k);scanf("%d%d",&sx,&sy);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%lld",&a[i][j]);for(int lv=0;lv<=min(n*m,k);lv++)f[lv][i][j]=-1e18; //IMPORTANT!!!}for(int l=0;l<5;l++){int tx=sx+dx[l],ty=sy+dy[l];f[1][tx][ty]=a[tx][ty];}ans=1ll*k*a[sx][sy];for(int lv=1;lv<=min(n*m,k);lv++)for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(f[lv][i][j]==-1e18) continue;ans=max(ans,f[lv][i][j]+1ll*(k-lv)*a[i][j]);for(int l=0;l<5;l++){int tx=i+dx[l],ty=j+dy[l];f[lv+1][tx][ty]=max(f[lv+1][tx][ty],f[lv][i][j]+a[tx][ty]);}}printf("%lld\n",ans);return 0;
}

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

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

相关文章

闲话 11.8

杂项乱写 11.8别问为啥这么晚才写,因为一天都不知道在干啥,要寄的节奏。11.7 晚轮到 CTH 写字Ratio:程立雪?啥意思,程门立雪?门呢? CTH:让我创掉了。上午把昨天晚上想到的题出了出来,见此。 由于 5k 们要打 nfls,所以只能找团委了,过了 hack 之后直接拿 \(\mathcal{…

Hive的搭建

一、上传解压配置环境变量 1.解压 tar -zxvf apache-hive-3.1.2-bin.tar.gz -C ../2.配置环境变量 vim /etc/profile3、重命名 mv apache-hive-3.1.2-bin hive-3.1.24.使环境变量生效 source /etc/profile 二、修改配置文件 1.拷贝一份文件 cp hive-default.xml.template hive-…

自动泊车端到端算法 ParkingE2E 介绍

01 算法介绍 自主泊车是智能驾驶领域中的一项关键任务。传统的泊车算法通常使用基于规则的方案来实现。因为算法设计复杂,这些方法在复杂泊车场景中的有效性较低。 相比之下,基于神经网络的方法往往比基于规则的方法更加直观和多功能。通过收集大量专家泊车轨迹数据,基于学习…

hive基础知识分享(三)

今天学习hive的最后部分!写在前面 今天继续学习hive部分的知识。 Hive中如何实现行列转换一行变多行 可以对表使用 LATERAL VIEW EXPLODE(),也可以直接使用 EXPLAIN() 函数来处理一行数据。 SELECT name, col1 FROM testarray2 LATERAL VIEW EXPLODE(weight) t1 AS col1;多行…

一文读懂远程控制协议—Remote Control Protocol

RCP是一种轻量级的通信协议,核心理念是将边缘节点控制器中MCU的协议转换功能迁移至区域控制器ZCU甚至中央控制器Central ECU中实现,从而实现针对边缘节点的远程控制,实现网络中软件集中化,边缘节点轻量化。 随着中央计算+区域控制的中央集中式架构广泛应用,10BASE-T…

2024-2025-1 20241305 《计算机基础与程序设计》第七周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)这个作业要求在哪里 2024-2025-1计算机基础与程序设计第七周作业这个作业的目标 1、数组与链表2、基于数组和基于链表实现数据结构3、无序表与有序表4、…

OSSFileBrowse:OSS存储桶遍历漏洞利用工具

简介: 由于经常遇到存储桶遍历漏洞,直接访问文件是下载,不方便预览,且甲方要求证明该存储桶的危害,因此该工具应运而生。 使用javafx做图形化,kkFileView做文件预览接口。 使用: 命令行运行: java -Dfile.encoding=UTF-8 -jar OSSFileBrowse-1.0-SNAPSHOT.jar或者直接点…

NetExec:新型内网/域渗透工具

免责声明 仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律及连带责任。简介: NetExec是一款强大的自动化网络安全评估和漏洞测试工具,作为已停止维护的CrackMapExec(CME)的现代替代品,它已被渗透测试人员和红队成…

2024-2025-1 20241407《计算机基础与程序设计》第七周学习总结

这个作业属于哪个课程 [2024-2025-1 计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)这个作业要求在哪里 2024-2025-1计算机基础与程序设计第七周作业这个作业的目标 学习数组与链表,基于数组和基于链表实现数据结构,无序表与有序表,树,图…

mysql ubuntu 卸载

mysql 卸载 :引用https://developer.aliyun.com/article/1306777 在 Ubuntu 系统中,MySQL 是一种常用的关系型数据库服务器。有时,我们可能需要完全卸载 MySQL 服务器,包括所有配置文件和数据,以便重新安装或切换到其他数据库服务器。本文将详细介绍在 Ubuntu 中如何完全卸…

MySQLMonitor: 黑盒测试Mysql实时监控辅助工具

MySQLMonitor MySQL实时监控工具(代码审计、黑盒测试辅助工具)使用 1.自行打包使用 git clone https://github.com/fupinglee/MySQLMonitorcd MySQLMonitormvn clean package -DskipTests=true打开target下的jar文件即可执行 2.直接下载使用 https://github.com/fupinglee/My…