AtCoder Beginner Contest 284

文章包含四个不同的C++代码实现:A程序按逆序输出数组;B程序计算给定整数序列中奇数的数量;C程序使用并查集解决不相交集合问题;D程序利用埃氏筛法找出给定数的平方因子;E程序展示了深度优先搜索在图遍历中的应用。
摘要由CSDN通过智能技术生成

A

#include<iostream>
#include<string>
using namespace std;
int main(){
    int n;
    string s[20];
    cin>>n;
    for(int i=1;i<=n;i++)cin>>s[i];
    for(int i=n;i>=1;i--)cout<<s[i]<<endl;
    return 0;
}

B

#include<iostream>
using namespace std;
int main(){
    int T,N,x,ans;
    cin>>T;
    while(T--){
        ans=0;
        cin>>N;
        for(int i=1;i<=N;i++){
            cin>>x;
            if(x%2==1)ans++;
        }
        cout<<ans<<endl;
    }
    return 0; 
}

C(并查集板子)

#include<iostream>
#include<algorithm>
using namespace std;
int fa[110],num[110];
int find(int x){
    if(x==fa[x]) return x;
    else{
    fa[x]=find(fa[x]);
    return fa[x];
}
}
void unity(int a,int b){
    fa[find(b)]=find(a);
}
int main(){
    int N,M,ans=0,u,v;
    cin>>N>>M;
    for(int i=1;i<=N;i++)fa[i]=i;
    for(int i=1;i<=M;i++){
        cin>>u>>v;
        unity(u,v);
    }
    for(int i=1;i<=N;i++){
        num[i]=find(i);
    }
    sort(num+1,num+N+1);
//    for(int i=1;i<=N;i++)cout<<num[i]<<endl;
    for(int i=1;i<N;i++){
        if(num[i]!=num[i+1]){
            ans++;
        }
    }
    cout<<ans+1;
    return 0;
}

D用埃氏筛法打表然后暴力试除。

#include<iostream>
#include<math.h>
#define int long long
using namespace std;
const int P=10000010;
bool str[P];             
int prime1[P],cnt;        
void prime()                    
{
    str[1] = 1;                        
    for(int i=2;i*i<=P;i++)
    {
        if(!str[i]) 
        {
            for(int j=i*i;j<=P;j+=i)
            str[j] = 1;    
        }                
    }
    for(int i=1;i<P;i++){
        if(!str[i])prime1[cnt++]=i;
    }
}
void ans(int x){
    for(int i = 0; i < cnt; i ++ )
    {
        if(x%(prime1[i]*prime1[i])==0){
            int n=x/prime1[i]/prime1[i];
            cout<<prime1[i]<<' '<<n<<endl;
            return;
        }
        if(x % prime1[i] == 0)
        {
            int num = x / prime1[i];
            int n = (int)sqrt(num);
            cout << n << " " << prime1[i] <<endl;
            return;
        }
    }

}
signed main(){
    int T,x;
    cin>>T;
    prime();
    for(int i=1;i<=T;i++){
        cin>>x;
        ans(x);
    }
    return 0;
}

E

注意下DFS中的坑:每次都要先判断,再对总的贡献++;

#include<iostream>
#include<algorithm>
#include <cstring>
#include<stdio.h>
using namespace std;
const int N = 10000000;
int h[N], e[N], ne[N], idx,n,m,u,v;
int ans;
bool used[N];
void add(int u, int v)
{
    e[idx] = v; ne[idx] = h[u]; h[u] = idx++;
}
void DFS(int x)
{
    if(ans==1000000)return;
    ans++;
    if (ans == 1000000)return;
    used[x] = true;
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!used[j])DFS(j);
    }
    used[x] = false;
}
int main()
{
    cin >> n >> m;
    memset(h, -1, sizeof(h));
    for (int i = 1; i <= m; i++)
    {
        cin >> u >> v;
        add(u, v); add(v, u);
    }
    DFS(1);
    cout << ans << endl;
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值