校内天梯选拔赛(NWPU)

版权声明:欢迎评论与转载,转载时请注明出处! https://blog.csdn.net/wjl_zyl_1314/article/details/88410999

这一套题目至少我已经看到的题目都很简单,但是可能是因为很少参加比赛比较紧张,心态没有调整好,没能拿到高分,还被刷下来了,只能说是怪自己心理承受能力差吧。
机会总是留给有准备的人。
不会因为你个人心情不好,紧张而再给你一次机会,比赛算是对每个人都是公平的。而且心态也算是你能力的一部分。
由于题目较简单 ,就以一篇blog来叙述了:
###1:
–>题目传送门<–
这一题是一个进制转换:题目也没有较多为难,进制都是10以内的~~(不像16进制恶心人)~~
但是这道题目,我当时想的比较复杂,字符串长度刚好在20位,我害怕超过了long long的范围,就没敢用整型去做,而是拿去当字符串做,做了一会儿才过了,比赛完了,试了用长整型去做,发现过了,只能说数据比较水(毕竟只占50分/1000分);
当成字符串直接用数组储存结果即可,数组间的运算。
当成长整型,就是不断地取余,右移,就出结果了。
AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define uLL unsigned long long
#define LL long long
int main()
{
    LL m,n,p;
    int ans[30],cnt=0;
    scanf("%lld<%lld>%lld",&m,&n,&p);
    memset(ans,0,sizeof(ans));
    printf("%lld<%lld>=",m,n);
    LL res=0,mod=1;
    while(m!=0)
    {
        res+=(m%10)*mod;
        m/=10;
        mod*=n;
    }
    mod=p;
    //cout<<res<<" :";
    while(res!=0)
    {
        ans[cnt++]=res%p;
        res/=p;
        //cout<<res<<" "<<ans[cnt-1]<<endl;
    }
    //if(ans[cnt]!=0)printf("%d",ans[cnt]);
    for(int i=cnt-1;i>=0;i--)
        printf("%d",ans[i]);
    printf("<%lld>",p);
    return 0;
}

###2:
–>题目传送门<–
这道题目就是有点繁琐,一直循环判断即可,里面用两个数组维护回文数即可。
AC代码:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define LL long long
int n,step=0,x[100],y[100];
bool check(int a[],int len)//判断是否回文
{
    if(len==1)return true;
    for(int i=0;i<len/2;i++)
    {
        if(a[i]!=a[len-i-1])
            return false;
    }
    return true;
}
void add(int &len,int n)//相加
{
    int i,res[30];
    memset(res,0,sizeof(res));
    for(i=0;x[i]>=0||res[i]>0;i++)
    {
        int sum=x[i]+y[i]+res[i];
        if(x[i]<0) sum=res[i];
        res[i]=sum%n;
        int j=1;
        while(sum!=0)
        {
            res[i+j]=(sum/n)%n;
            sum=sum/n;
            j++;
        }

    }
    len=i;
    for(int i=0;i<len;i++)
    {
        x[i]=res[i];
        y[i]=res[len-i-1];
    }
}
int main()
{

    memset(x,-1,sizeof(x));
    memset(y,-1,sizeof(y));
    string m;
    cin>>n>>m;
    int len=m.length();
    for(int i=0;i<len;i++)
    {
        if(n==16&&m[i]>='A'&&m[i]<='F')
            x[i]=m[i]-'A'+10;
        else
            x[i]=m[i]-'0';
        y[len-i-1]=x[i];
    }
    if(check(x,len))
    {
        cout<<"STEP=0"<<endl;
        return 0;
    }
    while(step<=30)
    {
        step++;
        add(len,n);
        if(check(y,len))
            break;
    }
    if(step>30)cout<<"Impossible!";
    else cout<<"STEP="<<step;
    return 0;
}

###3:
–>题目传送门<–
此题考的是递归,先序遍历,先输出根,而根就是其后序输出的最后一位,然后根据根和中序遍历顺序,将树分为左右子树,先左后右递归即可。(200分的水题
AC代码:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

void deal(string z,string h)
{
    int len=z.length(),pos;
    char x=h[len-1];
    cout<<x;
    if(len<=1)
    {
        return ;
    }
    string nz,nh;
    for(int i=0;i<len;i++)
    {
        if(z[i]==x)
        {
            pos=i;
            break;
        }
        nz+=z[i];
    }
    for(int i=0;i<len;i++)
    {
        for(int j=0;j<pos;j++)
        {
            if(h[i]==nz[j])
                nh+=h[i];
        }
    }
    int lez=nz.length();
    if(lez>0)
    deal(nz,nh);
    nz="",nh="";
    for(int i=pos+1;i<len;i++)
    {
        nz+=z[i];
    }
    for(int i=0;i<len;i++)
    {
        for(int j=0;j<len-pos-1;j++)
        {
            if(h[i]==nz[j])
                nh+=h[i];
        }
    }
    lez=nz.length();
    if(lez>0)
    deal(nz,nh);
    return ;
}

int main()
{
    string x,z,h;
    cin>>z>>h;
    deal(z,h);
    return 0;
}

图书馆关门了,还没写完…明日再写

猜你喜欢

转载自blog.csdn.net/wjl_zyl_1314/article/details/88410999
今日推荐