Acwing.第119场周赛

可惜这场比赛没打,去操场溜达去了哈哈哈哈
比赛链接

A 字符串还原

有一个由小写字母构成的字符串 b是通过以下方法生成的:
首先,构造一个由小写字母构成的长度不少于 2的字符串 a。
然后,按照从左到右的顺序,将字符串 a的所有长度为 2的子串拼接在一起,构成字符串 b。
例如,如果字符串 a为 abac,那么其所有长度为 2的子串从左到右依次为 ab、ba、ac,将它们拼接在一起,构成的字符串 b为 abbaac。
现在,给定构造好的字符串 b,请你还原出字符串 a。
可以证明,此问题的答案是唯一的。
输入格式
第一行包含整数 T,表示共有 T组测试数据。
每组数据占一行,包含一个由小写字母构成的字符串 b。
输入保证给定的字符串 b 一定是按照题目所述方法生成的。
输出格式
每组数据输出一行结果,一个字符串,表示字符串 a。
数据范围
前 3个测试点满足 1≤T≤10。
所有测试点满足 1≤T≤1000,2≤|b|≤100。

A思路:

这个题其实就是一个模拟,只要想通了就明白了,我们组成的字符串b字符重复地方是要做取舍的,如果有两个字符一样且是挨着的,那么我们只需要取其中一个就可以了。

A代码:

#include<bits/stdc++.h>
using namespace std;
void solve(){
    string a;
    cin>>a;
    for(int i=0;i<a.size();i++){
        if(i%2==0){
            cout<<a[i];
        }
        else{
            if(a[i]!=a[i+1]){
                cout<<a[i];
            }
            else{
                continue;
            }
        }
    }
    cout<<endl;

}
int main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

B 英文数字

给定一个小于 100 的非负整数 n,请输出其对应的英文写法。
关于数字的具体英文单词不再赘述,需注意的是:当一个数在 [21,99]范围内时,如果末位不为 0,则用来描述该数的两个单词需要用 - 连接,例如 twenty-one(21)、thirty-two(32)、ninety-nine(99)等等。

B思路:

我靠,这不就是一个巨麻烦的模拟吗???开个字符串数组打表就行了。

B代码:

#include <iostream>

using namespace std;
string s[] = {"zero", "one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty","twenty-one","twenty-two","twenty-three","twenty-four","twenty-five","twenty-six","twenty-seven","twenty-eight","twenty-nine","thirty","thirty-one","thirty-two","thirty-three","thirty-four","thirty-five","thirty-six","thirty-seven","thirty-eight","thirty-nine","forty","forty-one","forty-two","forty-three","forty-four","forty-five","forty-six","forty-even","forty-eight","forty-nine","fifty","fifty-one","fifty-two","fifty-three","fifty-four","fifty-five","fifty-six","fifty-seven","fifty-eight","fifty-nine","sixty","sixty-one","sixty-two","sixty-three","sixty-four","sixty-five","sixty-six","sixty-seven","sixty-eight","sixty-nine","seventy","seventy-one","seventy-two","seventy-three","seventy-four","seventy-five","seventy-six","seventy-seven","seventy-eight","seventy-nine","eighty","eighty-one","eighty-two","eighty-three","eighty-four","eighty-five","eighty-six","eighty-seven","eighty-eight","eighty-nine","ninety","ninety-one","ninety-two","ninety-three","ninety-four","ninety-five","ninety-six","ninety-seven","ninety-eight","ninety-nine"};
int main()
{
    int n; cin >> n;
    cout << s[n];
    return 0;
}

C 同色环

查看图片或题目
有一个 n×m的方格矩阵,每个方格都有一种颜色。
颜色最多不超过 26种,我们将使用不同的大写英文字母来表示不同的颜色。
你的任务是在矩阵中找到一个规模不小于 4的同色环。
也就是说,请你在矩阵中找到 k个不同的方格,要求它们能够同时满足:
k≥4
k个方格的颜色相同。
将这 k个方格按某种顺序编号为 1∼k后,能够满足方格 1与方格 2相邻、方格 2与方格 3相邻、…、方格 k−1与方格 k相邻、方格 k与方格 1相邻。如果两个方格存在公共边,则称两个方格相邻。
请你判断,在给定矩阵中是否存在满足条件的同色环。

C思路:

好好好,一眼就是求连通块的问题。

C代码:

#include<bits/stdc++.h>
using namespace std;
const int N=55;
char a[N][N];
bool f[N][N];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};

int n,m;
bool dfs(int x,int y,int x1,int y1,int cnt){
    if(x==x1&&y==y1&&cnt>=4){
        return true;
    }
    for(int i=0;i<4;i++){
        int x2=x1+dx[i];
        int y2=y1+dy[i];
        if(x2<1||x2>n||y1<1||y2>m){
            continue;
        }
        if(a[x2][y2]!=a[x1][y1]){
            continue;
        }
        if(f[x2][y2]){
            continue;
        }
        f[x2][y2]=true;
        if(dfs(x,y,x2,y2,cnt+1)){
            return true;
        }
        f[x2][y2]=false;

    }
    return false;
    
}
void solve(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            memset(f,false,sizeof f);

            bool flag=dfs(i,j,i,j,1);
            if(flag){
                cout<<"Yes"<<endl;
                return ;
            }
        }
    }
    cout<<"No"<<endl;
    return ;
}
int main(){
    int t;
    // cin>>t;
    t=1;
    while(t--){
        solve();
    }
    return 0;
}
posted @ 2023-09-03 19:39  du463  阅读(11)  评论(0编辑  收藏  举报