AcWing 106周赛

169 阅读1分钟

题目链接

A

给定一个长度为n 的字符串 s1s2…sn。 你需要对该字符串连续进行 m 次字符替换操作。 每次操作给定一个操作范围 [l,r] 和两个字符 c1、c2你需要将 sl…sr 中的所有 c1(如果有的话)都替换为 c2。 请你输出所有操作完成后,最终得到的字符串。

输入格式

第一行包含两个整数 n,m。 第二行包含一个长度为 n的字符串 s1s2…sn,此字符串由小写字母构成。 接下来 m 行,每行包含四个参数 l,r,c1,c2l,r,c1,c2,其中 c1 和 c2 均为小写字母。

输出格式

输出所有操作完成后,最终得到的字符串。

数据范围

前 3 个测试点满足 1n,m51≤n,m≤5。 所有测试点满足 1n,m1001lrn 1≤n,m≤100,1≤l≤r≤n

解题思路

这道题非常简单了,直接在给出的范围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 个整数 aija_{ij}表示连接点 i 和点 j 的边的长度。

输出格式

一个整数,表示给定图中距离最远的两个点之间的距离。

数据范围

前 3 个测试点满足 3n43≤n≤4。 所有测试点满足 3n101aij100aij=ajiaii=03≤n≤10,1≤a_{ij}≤100,a_{ij}=a_{ji},a_{ii}=0

输入样例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;

}