分享一下参加第十五届蓝桥杯当时的答案,本人水平有限,希望各位勿喷。
【问题描述】
8100178706957568
这个数在用
x
进制表示时
(
x
∈
[11
,
36]
)
,仅包含数字而
不包含字母,请问
x
是多少。比如
2588
用
16
进制表示为
a
1
c
,包含字母
a
和
c
答案:32
C++代码:
#include <iostream>
using namespace std;
int main(){
long long n;
cin>>n;
for(int i=11;i<=36;i++)
{
long long c=n;
int flag=0;
while(c/i)
{
if(c%i>9)
{
flag=1;
}
c=c/i;
}
if(flag==0)
{
cout<<i;
}
}
}
【问题描述】
有一个数组,包含
1
到
n
这
n
个整数,初始为一个从小到大的有序排列
:
{
1
,
2
,
3
,
4
,
· · ·
,
n
}
。一次随机交换操作指:均匀随机选取两个位置
i
,
j
∈
[1
,
n
]
且
i
,
j
,然后交换数组中这两个位置上的数。那么对于
n
= 51
,对初始数组进行
两次随机交换操作之后,数组中的
逆序对
的数量的期望是多少个。
答案:65.33
思路:暴力解法,先交换一次,然后再赋值给另外一个数组,再继续交换一次。
C++代码:
#include <iostream>
#include <iomanip>
#include <typeinfo>
using namespace std;
int main(){
int a[51],c[51];
for(int i=0;i<51;i++)
{
a[i]=i+1;
}
int b=1,t,count=0,z=0;
double changec=0.0;
for(int j=0;j<50;j++)
{
b=j+1;
while(b<=50)
{
t=a[j];
a[j]=a[b];
a[b]=t;
for(int i=0;i<51;i++)
{
c[i]=a[i];
}
for(int s=0;s<50;s++)
{
z=s+1;
while(z<=50)
{
t=c[s];
c[s]=c[z];
c[z]=t;
changec=changec+1;
for(int k=0;k<50;k++)
{
for(int m=k+1;m<51;m++)
{
if(c[k]>c[m])
{
count++;
}
}
}
t=c[z];
c[z]=c[s];
c[s]=t;
z++;
}
}
t=a[b];
a[b]=a[j];
a[j]=t;
b++;
}
}
double last;
last=count/(changec);
cout<< fixed << setprecision(2) <<last;
}
【问题描述】
小蓝在环球旅行时来到了一座古代遗迹,里面并排放置了
n
个传送阵,进
入第
i
个传送阵会被传送到第
a
i
个传送阵前,并且可以随时选择退出或者继续
进入当前传送阵。
小蓝为了探寻传送阵中的宝物,需要选择一个传送阵进入,然后连续进入
之后的传送阵。小蓝希望尽可能多地进入传送门以便搜索宝物,同时他可以使
用一次魔法,从某个传送阵
j
走到相邻的(第
j
−
1
或第
j
+ 1
个)传送阵,请
问小蓝最多能到达多少个不同的传送阵?一个传送阵可多次进入,但在计算答
案时只算一个。
【输入格式】
输入的第一行包含一个正整数
n
。
第二行包含
n
个正整数
a
1
,
a
2
,
· · ·
,
a
n
,相邻整数之间使用一个空格分隔。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
5
2 1 5 4 3
【样例输出】
4
【样例说明】
小蓝的路径可以是:
1
→
2
→
3
→
5
。其中
2
→
3
使用魔法。
C++代码:
#include <iostream>
#include <vector>
using namespace std;
long long n;
vector<long long> csm,vist;
long long con=1,cishu=0;
void dfs(long long a)
{
// cout<<a<<endl;
if(vist[a]==1)
{
return;
}
if(vist[a]==0)
{
cishu++;
// cout<<"cishu"<<cishu<<endl;
vist[a]=1;
dfs(csm[a]);
}
if(vist[a]==1&&con==1)//使用魔法
{
// cout<<"mofa"<<a<<endl;
con=0;
long long mf;
mf=a+1;
if(mf>n||vist[mf]==1)
{
mf=a-2;
if(mf<1||vist[mf]==1)
{
return;
}
else{
// cishu++;
dfs(mf);
}
}
else{
// cishu++;
dfs(mf);
}
}
}
int main()
{
cin>>n;
csm.push_back(0);
vist.push_back(0);
for(long long i=1;i<=n;i++)
{
long long t;
cin>>t;
csm.push_back(t);
vist.push_back(0);
}
dfs(1);
cout<<cishu;
return 0;
}
【问题描述】
小蓝找到了一个外星文明留下来的遗迹,遗迹大门的屏幕上有一个长度为
m
的字符串
t
和一个输入框,下面还有一个键盘,键盘为一个长度为
n
的字符
串
s
,由一个可以横向移动的指针来敲击键盘,指针可以向左移或向右移,不
能移出键盘。
小蓝需要在键盘字符串
s
上先指定指针初始位置然后不断移动指针的位置,
过程中通过敲击指针所在的字符来进行输入。然而,指针最多只能移动
L
的距
离,小蓝想输入一个尽可能长的一个
t
的前缀,请问他最多能输入多少位。
【输入格式】
输入的第一行包含三个正整数
n
,
m
,
L
,相邻整数之间使用一个空格分隔。
第二行包含一个长度为
n
的字符串
s
。
第三行包含一个长度为
m
的字符串
t
。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
3 6 5
abc
acbbac
【样例输出】
5
【样例说明】
初始选择指针位于键盘
abc
上的
a
,输入
acbbac
这
6
个字符分别需要指针
移动
0
,
2
,
1
,
0
,
1
,
2
的距离,而最大移动距离为
5
,所以最多输入
5
个字符,移
动
0 + 2 + 1 + 0 + 1 = 4
的距离。
【评测用例规模与约定】
对于
20
%
的评测用例,
1
≤
m
≤
20
;
对于所有评测用例,
1
≤
n
≤
10
3
,
1
≤
m
≤
10
5
,
1
≤
L
≤
10
9
且
s
,
t
中只包
含小写字母,且
s
中一定包含所有
t
中出现过的字母,数据保证随机。
C++代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
string a,b;
long long max1=-1;
long long count=0;
long long n,m,L;
long long deng=0;
void dfs(long long i,long long j,long long l) {
if(l==0) {
// cout<<count<<endl;
// if(a[i]==b[j]) {
//
// cout<<"i "<<i<<" "<<a[i]<<endl;
// cout<<"j "<<j<<" "<<b[j]<<endl;
// count++;
// deng++;
// cout<<"deng"<<deng;
// }
if(max1<count) {
max1=count;
}
return;
}
if(a[i]!=b[j]) {
if(j<n-1&&j>0) {
dfs(i,j+1,l-1);
dfs(i,j-1,l-1);
}
if(j==0) {
dfs(i,j+1,l-1);
}
if(j==n-1) {
dfs(i,j-1,l-1);
}
}
if(a[i]==b[j]) {
// cout<<"i "<<i<<" "<<a[i]<<endl;
// cout<<"j "<<j<<" "<<b[j]<<endl;
count++;
// cout<<count;
// cout<<"i"<<i<<endl;
if(i<n-1) {
i=i+1;
}
else {
i=0;
}
// cout<<j<<endl;
if((j<n-1&&j>0)) {
dfs(i,j+1,l-1);
dfs(i,j-1,l-1);
}
if(j==0) {
dfs(i,j+1,l-1);
}
if(j==n-1) {
dfs(i,j-1,l-1);
}
}
}
int main() {
cin>>n>>m>>L;
cin>>a;
cin>>b;
dfs(0,0,L);
cout<<max1;
return 0;
}
剩下的没时间做了。。我把题目放在下面,有能力的大佬可以做一下。






