AtCoder Beginner Contest 177 (A~E)

本文分享了一次算法竞赛的经历,详细解析了五道题目的解题思路与代码实现,涵盖速度判断、字符串编辑距离、数列求和、图论分组及最大公约数判断等算法知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本次比赛真的是打的稀烂,思路读完题就有了,自己细节不到位,调试了半天,WA了无数发,最后明明思路已经有了的E题没时间写,真的是太菜了,蒟蒻!
比赛链接
A
题意:
给你一个距离D,时间T,速度S,问是否可以在T时间内到达。
思路:
模拟比较即可。
AC代码:

#include<iostream>
#include<cstdio>
#include <stdio.h>
#include<algorithm>
#include<cstring>
#include <string>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#include<bits/stdc++.h>
#include <set>
#define ll   long long
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define inf 0x3f3f3f3f
#define pi 3.1415926535898
using namespace std;
const int N=2e5+10;
const int mod=1e9+7;
int a[N];

int main()
{
   int t,d,x;
   cin>>d>>t>>x;
   if(t*x>=d)
   {
       cout<<"Yes"<<endl;
   }
   else
   {
       cout<<"No"<<endl;
   }
    return 0;
}

B
题意:
给你两个字符串A,B,问A最少经过几次改变,B可以成为A的子串。
思路:
暴力枚举,求不同字符最少的。
AC代码:

#include<iostream>
#include<cstdio>
#include <stdio.h>
#include<algorithm>
#include<cstring>
#include <string>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#include<bits/stdc++.h>
#include <set>
#define ll   long long
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define inf 0x3f3f3f3f
#define pi 3.1415926535898
using namespace std;
const int N=2e5+10;
const int mod=1e9+7;


int main()
{
    char a[3010],b[3010];
    cin>>a>>b;
    int n,m;
    n=strlen(a);
    m=strlen(b);
    int sum=999999;
    for(int i=0; i<n-m+1; i++)
    {
        int ans=0;
        for(int j=0;j<m; j++)
        {
            if(a[i+j]!=b[j])
            {
                ans++;
            }
        }
        sum=min(ans,sum);
    }
    cout<<sum<<endl;
    return 0;
}

C
题意:
一个数列N,求所有AiAj的和,1<=i<j<=n;
思路:
根据题意,可以转化为Ai
(Ai前面所有数的和)的和,
AC代码

#include<iostream>
#include<cstdio>
#include <stdio.h>
#include<algorithm>
#include<cstring>
#include <string>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#include<bits/stdc++.h>
#include <set>
#define ll   long long
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define inf 0x3f3f3f3f
#define pi 3.1415926535898
using namespace std;
const int N=2e5+10;
const int mod=1e9+7;
ll a[N];
ll b[N];
ll ans;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        ll x;
        cin>>x;
        b[i]=x;
        a[i]=a[i-1]+x;//前缀和
    }
    for(int i=1;i<=n;i++)
    {
        ans=(ans+(b[i]*(a[i-1]%mod)%mod))%mod;//注意前缀和可能过1E9会炸LL
        
    }
    cout<<ans<<endl;
    return 0;
}

D
题意:
现在有N个人,M个消息,每个消息是I,J为朋友关系,朋友关系是传递的,现在问,如何分组,才能使每组的人都不是朋友。
思路:
根据题意可知,这个题目是要你求朋友关系中,最多的人有多少个,这些人都不能在同一组,所以最多的组数是朋友关系最多的。
AC代码:

#include<iostream>
#include<cstdio>
#include <stdio.h>
#include<algorithm>
#include<cstring>
#include <string>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#include<bits/stdc++.h>
#include <set>
#define ll   long long
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define inf 0x3f3f3f3f
#define pi 3.1415926535898
using namespace std;
const int N=2e5+10;
const int mod=1e9+7;
ll f[N+1];
ll b[N+1];
ll finds(ll x)
{
    if(f[x]!=x)
        f[x]=finds(f[x]);
    return f[x];
}
void uni(ll x,ll y)
{

    ll x1=finds(x);
    ll y1=finds(y);
    ll a=min(x1,y1);
    ll b=max(x1,y1);
    f[b]=f[a];

}
int main()
{
    for(int i=1; i<N; i++)
    {
        f[i]=i;
    }
    int n,m;
    cin>>n>>m;
    for(int i=0; i<m; i++)
    {
        int x,y;
        cin>>x>>y;
        uni(x,y);
    }
    ll maxs=-99999;
    for(int i=1; i<=n; i++)
    {
        b[finds(i)]++;
    }
    for(int i=1; i<=n; i++)
    {
        maxs=max(maxs,b[i]);
    }
    cout<<maxs<<endl;
    return 0;
}

E
题意:
给你一个数组,如果两两的GCD为1则输出pairwise coprime,如果所有数的GCD为1则输出setwise coprime,否则输出not coprime。
思路:
对每个数因式分解,并且统计他的因数,如果所有因数都只出现一次则代表所有数都两两互质输出pairwise coprime,如果有一个因数出现了N次则代表所有数的GCD不等于1输出not coprime,否则输出setwise coprime。
AC代码:

#include<iostream>
#include<cstdio>
#include <stdio.h>
#include<algorithm>
#include<cstring>
#include <string>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#include<bits/stdc++.h>
#include <set>
#define ll   long long
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define inf 0x3f3f3f3f
#define pi 3.1415926535898
using namespace std;
const int N=1e6+10;
const int mod=1e9+7;
using namespace std;
int boom[N];//记录因数
int primes[N];//保存质数
int cnt;
int st[N];
void ola(int n)//筛素数
{
    for (int i = 2; i <= n; i ++ )
    {
        if (st[i] == 0) primes[cnt ++ ] = i;//将质数存到primes中
        for (int j = 0; primes[j] <= n / i; j ++ )//要确保质数的第i倍是小于等于n的。
        {
            st[primes[j] * i] = 1;
            if (i % primes[j] == 0) break;
        }
    }
}
int main()
{
    ola(2000);
    int n;cin>>n;
    for(int i=0;i<n;i++)
    {
        int t;cin>>t;
        for(int i=0;i<cnt;i++)//因式分解
        {
            int tot=0;
            while(t%primes[i]==0)
            {
                t/=primes[i];
                tot=1;
            }
            if(tot) boom[primes[i]]++;//保留因数
        }
        if(t>1) boom[t]++;
    }
    int st=0;
    for(int i=1;i<1000005;i++)//统计因数的个数
    {
        if(boom[i]>=2) st++;
        if(boom[i]==n)
        {
            cout<<"not coprime"<<endl;
            return 0;
        }
    }
    if(st==0)
    {
        cout<<"pairwise coprime"<<endl;
    }
    else
        cout<<"setwise coprime"<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值