AcWing第36场周赛题解

第36场周赛活动链接

problem.A AcWing4212 字符串比较

暴力处理,利用ascii码,忘记ascii码也没关系,可以写个小程序输出,比如cout<<(int)'a',就知道a的ascii码了

代码

#include <iostream>

using namespace std;

int main()
{
    string tmp;
    cin>>tmp;
    for(int i=0;i<tmp.size();i++)
    {
        if(tmp[i]>='A'&&tmp[i]<='Z') tmp[i]+=32;
        char c=tmp[i];
        if(c!='a'&&c!='o'&&c!='y'&&c!='e'&&c!='u'&&c!='i')
            cout<<'.'<<c;
    }
        
    return 0;
}

problem.B AcWing4216 图中的环

利用并查集,一个环上就是同一个集合,最后看剩几个集合

代码1 并查集

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110;

int n, m;
int p[N];

int find(int x)
{
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}

int main()
{
    cin >> n >> m;

    if (n != m) puts("NO");
    else
    {
        for (int i = 1; i <= n; i ++ )
            p[i] = i;

        int cnt = n;
        while (m -- )
        {
            int a, b;
            cin >> a >> b;
            if (find(a) != find(b))
            {
                cnt -- ;
                p[find(a)] = find(b);
            }
        }

        if (cnt == 1) puts("YES");
        else puts("NO");
    }

    return 0;
}

也可利用dfs,

代码2 dfs

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>

using namespace std;

const int N = 1010;

int n,m;
int h[N], e[N], ne[N], idx;
bool st[N];
int cnt;

void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

void dfs(int u,int before)
{
    st[u] = true; 

    for (int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        
        if (!st[j]) dfs(j,u);
        else if(j!=before) cnt++;
    }
}

int main()
{
    memset(h, -1, sizeof h);
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int a,b;
        cin>>a>>b;
        add(a,b);add(b,a);
    }
    
    dfs(1,1);
    bool flag=true;
    for(int i=1;i<=n;i++)
        if(st[i]==false)
        {
            flag=false;
            break;
        }
    if(cnt>=3||cnt==0) flag=false;
    if(flag) puts("YES");
    else puts("NO");
    
    return 0;
}

problem.C AcWing4217 机器人移动

法1.双指针算法O(n)
法2.二分O(nlogn),从编辑长度:\(0~n\)中以O(logn)速度找出最短长度,根据长度以O(n)速度从\(1~n\)找到该长度所在的位置,再以O(1)的速度判定此长度起始位置、此长度是否能满足编辑后的程序能从(0,0)到(a,b)

代码

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 3010;

const int INF = 0x3f3f3f3f;
int s[N],c[N];

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>s[i];
    for(int i=1;i<=n;i++) cin>>c[i];
    
    int res=INF;
    for(int i=2;i<n;i++)
    {
        int a=INF,b=INF;
        for(int j=1;j<i;j++)
            if(s[j]<s[i]) a=min(a,c[j]);
        for(int j=i+1;j<=n;j++)
            if(s[j]>s[i]) b=min(b,c[j]);
        res=min(res,a+c[i]+b);
    }
    
    if(res==INF) cout<<"-1";
    else cout<<res;
    
    return 0;
}
posted @ 2022-01-30 09:37  泝涉江潭  阅读(19)  评论(0)    收藏  举报