前言
今天和往常一样,没什么不同,喔,对了,我们宿舍的五年级的回家了
今天一共做了四题
第一题
题目大意
给出一个超大正整数s,求出n, 使得n为正整数,且n^n=s
输入样例
387420489
输出样例
9
解题思路
这道题一开始我在比赛的时候,想打表,但看数据太大就放弃了
后来用一种方法,就是不断的%10看它有几位数,再log10一下,i再乘于,即可
程序如下
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
string a;
long long i;
int main()
{
freopen("yy.in","r",stdin);
freopen("yy.out","w",stdout);
cin>>a;
for (i=1;i<=a.size();i++)//枚举长度
{
if (floor(i*log10(i)+1)==a.size()) //判断位数并相乘
break;//如果找到就退出
}
cout<<i;
fclose(stdin);
fclose(stdout);
return 0;
}
第二题
题目大意
游戏设有一个黑方和一个白方。游戏桌面是正方形的,包含8行8列…
被包夹有白子之间没有空格才能变
为这个游戏设计一个程序,计算一步棋中黑方能转变的白子数量的最大值…
输入样例
…
…
…
…BW…
…WB…
…
…
…
输出样例
1
解题思路
这道题其实可以用递归来做,也可以用搜索,我是用递归来做的
其实就是来判断一个棋子的八个方向是否有白旗,再看是否有另外的黑旗来夹击
程序如下
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int dx[9]={-1,-1,-1,0,0,1,1,1};
const int dy[9]={-1,0,1,-1,1,-1,0,1};
int b[1001][1001],ans,sum,re;
char a;
int dfs(int t,int x,int y)
{
dfs=dfs(t,x+dx[t],y+dy[t]);
return dfs;
}
int main()
{
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
a=getchar();
if(a=='B') b[i][j]=1;
if(a=='.') b[i][j]=0;
if(a=='W') b[i][j]=2;
}
}
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
for(int k=1;k<=8;k++)
if(b[i][j]==0)
{
ans=dfs(k,i+dx[i],j+dy[j]);
if(ans>0)
{
sum=sum+ans;
}
}
}
if(sum>re)
{
re=sum;
}
sum=0;
}
printf("%d",sum);
fclose(stdin);
fclose(stdout);
return 0;
}
第三题
题目大意
现在有n个数列,每个数列都有一个值,问到第n个数列是最小值
输入样例
6
1
2
3
4
5
6
输出样例
12
第四题
题目大意
专辑里的某首歌播放出至少一半歌词的时候猜出歌名
给出歌名和专辑名,看看Mirko在这首歌的哪个点上(在多少个单词之后)猜出歌名…
输入样例
3
sedam
gladnih
patuljaka
7
sedam
dana
sedam
noci
sedam
gladnih
godina
输出样例
6