还是一样水更一天,就随便做了几个题,有一个周期有点长,后面更一篇长的
随手刷的一道水题,就不往今天的行程单添了
问题:最大公约数
题解:题目太水了,就是求三个数,其中两组的最大公约数,在对这两个公约数求最大公约数,得解
#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;
}
题解,就是一个很简单的求深度的问题,没有太多复杂的,左孩子不为空就去深搜左孩子,右孩子不为空,就去搜索右孩子,在每次调用的时候都要进行比较,需要更新最大深度,最后输出就可以,很简单,直接看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;
}
题解:这题其实其实可以相成思维性题目,既然要求亚军,且又是左右两个相邻的国家比,因此就可以将整个数组分成两部分,找出左半部分的最大值的下标,和右半部分的最大值的下标,比较两个下标指向的数,小的那个数的下标就是亚军的编号,直接看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进制,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;
}