题目链接
A
给定一个长度为n 的字符串 s1s2…sn。 你需要对该字符串连续进行 m 次字符替换操作。 每次操作给定一个操作范围 [l,r] 和两个字符 c1、c2你需要将 sl…sr 中的所有 c1(如果有的话)都替换为 c2。 请你输出所有操作完成后,最终得到的字符串。
输入格式
第一行包含两个整数 n,m。 第二行包含一个长度为 n的字符串 s1s2…sn,此字符串由小写字母构成。 接下来 m 行,每行包含四个参数 ,其中 c1 和 c2 均为小写字母。
输出格式
输出所有操作完成后,最终得到的字符串。
数据范围
前 3 个测试点满足 。 所有测试点满足。
解题思路
这道题非常简单了,直接在给出的范围l~r中找c1,如果存在就替换为c2。这里只需要注意一下范围即可,因为字符串string下标是从0开始的。
AC代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define int long long
#define endl '\n'
typedef long long ll;
signed main()
{
int n,m;
cin >> n>>m;
string s;
cin>>s;
while(m--)
{
int l,r;
char c1,c2;
cin>>l>>r>>c1>>c2;
for(int i=l-1;i<=r-1;i++)
{
if(s[i]==c1)
{
s[i] = c2;
}
}
}
cout<<s;
return 0;
}
B
题目详情
给定一个 n 个点的无向完全图,点的编号 1∼n。 图中所有边的长度已知。 我们规定,两点之间的距离指两点之间的最短路径长度。 请你计算,给定图中距离最远的两个点之间的距离。
输入格式
第一行包含整数 n。 接下来 n 行,每行包含 n 个整数,其中第 i 行第 j 个整数 表示连接点 i 和点 j 的边的长度。
输出格式
一个整数,表示给定图中距离最远的两个点之间的距离。
数据范围
前 3 个测试点满足 。 所有测试点满足 。
输入样例1
3
0 1 1
1 0 4
1 4 0
输出样例1:
2
输入样例2:
4
0 1 2 3
1 0 4 5
2 4 0 6
3 5 6 0
输出样例2:
5
解题思路
其实很简单,题目让我们求出最长的最短距离,那我们就先求出所有点之间的最短距离,然后再找到最大的值即可。这里我用Floyd来求多源最短路,直接三重循环即可。
AC代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define int long long
#define endl '\n'
typedef long long ll;
const int N =1000;
int g[N][N],d[N][N];
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>g\[i]\[j];
//三层循环求最短距离
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
int res = -1000;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
res = max(res,g[i][j]);
}
cout<<res;
return 0;
}