校内天梯选拔赛(NWPU)
作者:互联网
这一套题目至少我已经看到的题目都很简单,但是可能是因为很少参加比赛比较紧张,心态没有调整好,没能拿到高分,还被刷下来了,只能说是怪自己心理承受能力差吧。
机会总是留给有准备的人。
不会因为你个人心情不好,紧张而再给你一次机会,比赛算是对每个人都是公平的。而且心态也算是你能力的一部分。
由于题目较简单 ,就以一篇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;
}
图书馆关门了,还没写完…明日再写
标签:NWPU,int,long,len,选拔赛,天梯,题目,include,mod 来源: https://blog.csdn.net/wjl_zyl_1314/article/details/88410999