2.1总结

还是一样水更一天,就随便做了几个题,有一个周期有点长,后面更一篇长的

随手刷的一道水题,就不往今天的行程单添了

问题:最大公约数

2.1总结_第1张图片

题解:题目太水了,就是求三个数,其中两组的最大公约数,在对这两个公约数求最大公约数,得解

#include 
using namespace std;


int gcd(int a,int b)
{
    if(a%b==0)
        return b;
    else
        return gcd(b,a%b);
}
int main()
{
    int x,y,z;
    scanf("%d%d%d",&x,&y,&z);
    int p=gcd(x,y);
    int q=gcd(x,z);
    int t=gcd(p,q);
    printf("%d",t);
    return 0;
}

 

问题一:二叉树的深度

2.1总结_第2张图片 

题解,就是一个很简单的求深度的问题,没有太多复杂的,左孩子不为空就去深搜左孩子,右孩子不为空,就去搜索右孩子,在每次调用的时候都要进行比较,需要更新最大深度,最后输出就可以,很简单,直接看AC代码

#include
using namespace std;
int f[1000005][3];//用f[i][0]去存储左孩子,f[i][1]去存储右孩子
int n,max1;
void dfs(int x,int d)//x代表第几个结点,d代表深度
{
    max1=max(max1,d);//更新最大值
    if(f[x][0]!=0)//先去搜索左子树
    {
        dfs(f[x][0],d+1);
    }
    if(f[x][1]!=0)//搜索右子树
    {
        dfs(f[x][1],d+1);
    }
}
int main()
{
    scanf("%d",&n);//输入有几个值

    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&f[i][0],&f[i][1]);//输入每个结点的左结点和右结点
    }
    dfs(1,1);
    printf("%d",max1);//输出最大值
    return 0;
}

 问题二:淘汰赛

2.1总结_第3张图片 

题解:这题其实其实可以相成思维性题目,既然要求亚军,且又是左右两个相邻的国家比,因此就可以将整个数组分成两部分,找出左半部分的最大值的下标,和右半部分的最大值的下标,比较两个下标指向的数,小的那个数的下标就是亚军的编号,直接看AC代码

#include 
using namespace std;
int n;
int s[200];
int main()
{
    scanf("%d",&n);
    int sum=1;
    for(int i=0;is[z1])
            z1=i;
    }
    for(int i=sum/2+1;i<=sum;i++)
    {
        if(s[i]>s[z2])
            z2=i;
    }
    if(s[z1]>s[z2])
        printf("%d",z2);
    else
        printf("%d",z1);
    return 0;
}

 问题三:电子表格

 2.1总结_第4张图片

题解:类似于2进制,8进制,14进制的题目,这题没有任何算法,但是数据的恶心程度已经超过了你的想象。

A代表1,Z代表26,以此类推,所以你以为这就是简单的26进制题吗?NO,因为没有任何一个字母会去表示0,所以是一个隐藏的27进制的题目 (ps:确实有够抽象的,栽了一回)

#include
using namespace std;

char a[1000009];
char s[1000009];
int n,r,c,i,len;
int flag;
int main()
{

    scanf("%d",&n);
    while (n--)
    {
        scanf("%s",a);
        len=strlen(a);
        r=0;
        c=0;
        if (a[0]=='R'&&isdigit(a[1])&&(strchr(a,'C')-a)>0)//这俩函数你应该懂isdigit,判断是否是十进制数字,strchr检查数组里面是否有C
            flag=0;//用于处理R23C55——转成另外一种
        else
            flag=1;

        if (flag)
        {
            i=0;
            r=0;
            c=0;
            for (i=0; istrchr(a,'C')-a)
                    c = 10*c+(a[i]-'0');
            }
            i=0;
            while (c>0)
            {
                s[i]=(c-1)%26+'A';
                if (c%26)
                    c/=26;
                else
                    c=c/26-1;
                i++;
            }
            for (i=i-1;i>=0;i--)
                printf("%c",s[i]);
            printf("%d\n",r);
        }
    }
    return 0;
}

你可能感兴趣的:(深度优先,算法,图论)