atcoder ABC 232 B~E题解

B
模拟,水题
#include<bits/stdc++.h>
using namespace std;
char s1[100005],s2[100005];
int a1[100005],a2[100005],bj;
int main()
{
cin>>s1>>s2;
int len=strlen(s1);
for(int i=0;i<len;i++)
{
a1[i]=s1[i]-97;
a2[i]=s2[i]-97;
}
for(int i=0;i<26;i++)
{
bj=0;
for(int j=0;j<len;j++)
{
a1[j]=(a1[j]+1)%26;
}
for(int j=0;j<len;j++)
{
if(a1[j]!=a2[j])
{
bj=1;
break;
}
}
if(bj==0)
{
cout<<"Yes";
return 0;
}
}
cout<<"No";
}
C
全排列求出P数组的所有可能,邻接矩阵存图,对每个\(P_i\)进行一次判断
#include <bits/stdc++.h>
using namespace std;
int ans[100001],n,m,bj[100001];
int sq1[10][10],sq2[10][10];
struct node
{
int x,y;
}bian[100];
void dfs(int k)
{
int i;
if(k>n)
{
int bz=0;
for(i=1;i<=m;i++)
{
if(sq2[ans[bian[i].x]][ans[bian[i].y]]!=1)
{
return;
}
}
cout<<"Yes";
exit(0);
}
for(i=1;i<=n;i++)
{
if(!bj[i])
{
ans[k]=i;
bj[i]=1;
dfs(k+1);
bj[i]=0;
ans[k]=0;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
sq1[y][x]=1,sq1[x][y]=1;
bian[i].x=x,bian[i].y=y;
}
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
sq2[x][y]=1,sq2[y][x]=1;
}
dfs(1);
cout<<"No";
return 0;
}
D
每个位置(i,j)都可以从(i-1,j)和(i,j-1)走到,因此状态转移方程是\(f_{i,j}=f_{i-1,j}+f_{i,j-1}\),但当(i-1,j)或(i,j-1)有墙时就不能通过,
所以需要进行特判
#include<bits/stdc++.h>
using namespace std;
int ans,n,m,dp[1005][1005],bj[101][101],maxn;
char c[1005][1005];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",c[i]+1);
}
dp[1][1]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(c[i][j]=='#'||(dp[i-1][j]==0&&dp[i][j-1]==0))//判断是否有墙
{
continue;
}
dp[i][j]=max(dp[i][j],max(dp[i-1][j],dp[i][j-1])+1);
ans=max(ans,dp[i][j]);
}
}
cout<<ans;
}
E
DP题
设\(x[K][1]\)表示上下移动\(K\)次达到了\((x2,y2)\),
\(x[K][0]\)表示上下移动\(K\)次没达到\((x2,y2)\),
\(y[K][1]\)表示左右移动\(K\)次达到了\((x2,y2)\),
\(y[K][0]\)表示左右移动\(K\)次没达到\((x2,y2)\),
那么我们就可以得到状态转移方程
\(x[i][1]\):第\(i\)步到达了,那么\(i-1\)步一定是没有到达的,因为不可以静止不动
\(x[i][1]=x[i-1][0]\)
\(x[i][0]\):第\(i\)步没有到达,那么第\(i-1\)步可以分为没有到达与到达
如果第\(i-1\)步没有到达\(X[i-1][0]\) 又因为第i步也没有达到所以第\(i\)步有\(h-2\)种选择(不能是终点和不动)
如果第\(i-1\)步到达了 \(X[i-1][1]\) 又因为第i步也没有达到所以第\(i\)步有\(h-1\)种选择(不能不动)
\(X[i][0]=X[i-1][0]*(h-2)+X[i-1][1]*(h-1)\)
另一个数组也是同理
\(Y[i][1]=Y[i-1][0]\)
\(Y[i][0]=Y[i-1][0]*(w-2)+Y[i-1][1]*(w-1)\)
当\(x1==x2\)的时候\(X\)在第0步的时候就已经到达终点即\(X[0][1]=1\)
否则\(X[0][0]=1\)
当\(y1==y2\)的时候\(Y\)在第0步的时候就已经到达终点即\(Y[0][1]=1\)
否则\(Y[0][0]=1\)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 998244353
ll X[1000010][2],Y[1000010][2];
ll jc[1000010],inv[1000010];
ll n,m,k,x1,Y1,x2,y2;
ll qmi(ll a,ll b,ll p)
{
if(!a)return 0;
a%=p;
ll res=1;
while(b)
{
if(b&1)res=res*a%p;
a=a*a%p;
b>>=1;
}
return res;
}
ll C(ll a,ll b)
{
if(a<b)return 0;
return jc[a]*inv[b]%mod*inv[a-b]%mod;
}
int main()
{
cin>>n>>m>>k;
cin>>x1>>Y1>>x2>>y2;
X[0][x1==x2]=1;
Y[0][Y1==y2]=1;
for(ll i=1;i<=k;i++)
{
X[i][1]=X[i-1][0];
X[i][0]=(X[i-1][0]*(n-2)%mod+X[i-1][1]*(n-1)%mod)%mod;
Y[i][1]=Y[i-1][0];
Y[i][0]=(Y[i-1][0]*(m-2)%mod+Y[i-1][1]*(m-1)%mod)%mod;
}
jc[0]=inv[0]=1;
for (ll i=1;i<1000010;i++)
{
jc[i]=jc[i-1]*i%mod;
inv[i]=inv[i-1]*qmi(i,mod-2,mod)%mod;
}
ll res=0;
for(ll i=0;i<=k;i++)
{
ll t=C(k,i)*X[i][1]%mod*Y[k-i][1]%mod;//组合数算答案,给x分配i步,y就是k-i步,还要乘一个C(k,i)
res=(res+t)%mod;
}
cout<<res<<endl;
}
atcoder ABC 232 B~E题解的更多相关文章
- AtCoder ABC 242 题解
AtCoder ABC 242 题解 A T-shirt 排名前 \(A\) 可得 T-shirt 排名 \([A+1,B]\) 中随机选 \(C\) 个得 T-shirt 给出排名 \(X\) ,求 ...
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...
- ATCODER ABC 099
ATCODER ABC 099 记录一下自己第一场AK的比赛吧...虽然还是被各种踩... 只能说ABC确实是比较容易. A 题目大意 给你一个数(1~1999),让你判断它是不是大于999. Sol ...
- Atcoder ABC 141
Atcoder ABC 141 A - Weather Prediction SB题啊,不讲. #include<iostream> #include<cstdio> #inc ...
- Atcoder ABC 139E
Atcoder ABC 139E 题意: n支球队大循环赛,每支队伍一天只能打一场,求最少几天能打完. 解法: 考虑抽象图论模型,既然一天只能打一场,那么就把每一支球队和它需要交手的球队连边. 求出拓 ...
- Atcoder ABC 139D
Atcoder ABC 139D 解法: 等差数列求和公式,记得开 $ long long $ CODE: #include<iostream> #include<cstdio> ...
- Atcoder ABC 139C
Atcoder ABC 139C 题意: 有 $ n $ 个正方形,选择一个起始位置,使得从这个位置向右的小于等于这个正方形的高度的数量最多. 解法: 简单递推. CODE: #include< ...
- Atcoder ABC 139B
Atcoder ABC 139B 题意: 一开始有1个插口,你的插排有 $ a $ 个插口,你需要 $ b $ 个插口,问你最少需要多少个插排. 解法: 暴力模拟. CODE: #include< ...
- Atcoder ABC 139A
Atcoder ABC 139A 题意: 给你两个字符串,记录对应位置字符相同的个数 $ (n=3) $ 解法: 暴力枚举. CODE: #include<iostream> #inclu ...
随机推荐
- java自学中出现的问题或者?
自学java之路,是如此的坎坷.经过一段时间的自学,我得出一些总结! 总结如下: 1. 在学习编程之路(Java)的,最基本的还是学习之路,对编程前程深感迷茫2. 网络中有许许多多的编程 ...
- CentOS 8迁移Rocky Linux 8手记
前言 由于CentOS 8的支持已经到期了,.NET 6也不支持了,然后也无法升级,导致使用起来已经非常不便,无奈只有迁移服务器这个选项了. 选择发行版本一直是一个比较头疼的问题,首先我不是专门运维的 ...
- sa-token client登录逻辑
- Node.js 中的进程和线程
线程和进程是计算机操作系统的基础概念,在程序员中属于高频词汇,那如何理解呢?Node.js 中的进程和线程又是怎样的呢? 一.进程和线程 1.1.专业性文字定义 进程(Process),进程是计算机中 ...
- Python-100-Days-master-第二周笔记
python100day学习第二周 # 通过enumerate函数处理列表之后再遍历可以同时获得元素索引和值 list1 = [1, 3, 5, 7, 100] for index, elem in ...
- vue生命周期加载顺序
1.beforeCreate(创建前)表示实例完全被创建出来之前,vue 实例的挂载元素$el和数据对象 data 都为 undefined,还未初始化.此钩子函数不能获取到数据,dom元素也没有渲染 ...
- [gym102978C] Count Min Ratio
[gym102978C] Count Min Ratio 给定 \(B\) 个蓝色的球. \(R\) 个红色的球以及一个绿色的球,同颜色的球不可区分.对于一种球的排列方式,记 \(l_B,r_B,l_ ...
- Python数据分析--Numpy常用函数介绍(5)--Numpy中的相关性函数
摘要:NumPy中包含大量的函数,这些函数的设计初衷是能更方便地使用,掌握解这些函数,可以提升自己的工作效率.这些函数包括数组元素的选取和多项式运算等.下面通过实例进行详细了解. 前述通过对某公司股票 ...
- 10分钟学会 API 测试 !
本文面向对象主要是后端开发人员 API 开发好之后,我们需要对 API 进行简单的调试,确保 API 可以跑通再提交给前端人员进行对接或者是测试人员对 API 进行测试: 在测试过程中我们关注 ...
- C++ 智能指针浅析
C++ 智能指针浅析 为了解决 C++ 中内存管理这个老大难问题,C++ 11 中提供了三种可用的智能指针.(早期标准库中还存在一种 auto_ptr,但由于设计上的缺陷,已经被 unique_ptr ...