Codeforces_Codeforces Round #479 (Div. 3)D-E题解

题目链接:Divide by three, multiply by two

第一次做div3的题,D题还是很简单的,题目意思:

给出一系列数字,要求我们给数组排序,后面一位是前面一位除以3或者乘以2得到的,我们发现这个数组最大为100,那么我们就可以很快地想到深搜,并且一定存在答案

在第一位置的时候,我们不需要进行判断,直接放到数组中,后面每一个元素的添加,必须满足我们之前的条件,这样满足条件的很好,所以深搜很快就会完成

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
const int MAXN = 150;
int n;
ll a[MAXN],ans[MAXN];
bool vis[MAXN];

void Dfs(int pos)
{
    if(pos == n)
    {
        for(int i = 0;i < n;i ++)
            printf("%I64d%c",ans[i],i==n-1?'\n':' ');
        return ;
    }
    for(int i = 0;i < n;i ++)
    {
        if(pos == 0)
        {
            vis[i] = true;
            ans[pos] = a[i];
            Dfs(pos+1);
            vis[i] = false;
        }
        if(vis[i] == false)
        {
            if(a[i] * 3 == ans[pos-1] || ans[pos-1] * 2 == a[i])
            {
                vis[i] = true;
                ans[pos] = a[i];
                Dfs(pos+1);
                vis[i] = false;
            }
        }
    }
    return ;
}
int main()
{
    memset(vis,false,sizeof(vis));
    scanf("%d",&n);
    for(int i = 0;i < n;i ++)
        scanf("%I64d",&a[i]);
    Dfs(0);
    return 0;
}

Cyclic Components

题目要求我们找出所有点的子集满足:所有点连接形成一个环,并且不能有其他多余的边,也就是在这个环上的每个点的度只能是2,我们要找这样子集的个数

我们已知上面的条件,每个点的度只能是2,那么我们就枚举每一个度为2的点,然后判断相互连接的度数为2的点,一直向后遍历,判断最终是否回到起点,并且环中点的个数大于2

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
const int MAXN = 410000;
struct Edge
{
    int u,v,next;
}edge[MAXN];
int head[MAXN],n,m,in_drgee[MAXN],k,P,num;
bool vis[MAXN];
void Add_edge(int u,int v)
{
    edge[k].u = u;edge[k].v = v;edge[k].next = head[u];head[u] = k++;
}
int dfs(int pos)
{
    vis[pos] = true;
    int ans = 0;
    for(int i = head[pos];i != -1;i = edge[i].next)
    {
        int v = edge[i].v;
        if(vis[v] == false && in_drgee[v] == 2)
        {
            num++;
            ans += dfs(v);
            num--;
        }
        if(v == P && num >= 2)
        {
            return 1;
        }
    }
    return ans;
}
int main()
{
    k = 0;
    memset(in_drgee,0,sizeof(in_drgee));
    memset(head,-1,sizeof(head));
    scanf("%d%d",&n,&m);
    int x,y;
    for(int i = 0;i < m;i ++)
    {
        scanf("%d%d",&x,&y);
        Add_edge(x,y);
        Add_edge(y,x);
        in_drgee[x] ++;in_drgee[y] ++;
    }
    int ans = 0;
    memset(vis,0,sizeof(vis));
    for(int i =1 ;i <= n;i ++)
    {
        if(vis[i] == false && in_drgee[i] == 2)
        {
            P = i;num = 0;
            ans += dfs(i);
        }

    }
    printf("%d\n",ans);
}

猜你喜欢

转载自blog.csdn.net/li1615882553/article/details/80412722