还是一样水更一天,就随便做了几个题,有一个周期有点长,后面更一篇长的
随手刷的一道水题,就不往今天的行程单添了
问题:最大公约数
题解:题目太水了,就是求三个数,其中两组的最大公约数,在对这两个公约数求最大公约数,得解
#include <bits/stdc++.h>
using namespace std;int gcd(int a,int b)
{if(a%b==0)return b;elsereturn 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<bits/stdc++.h>
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 <bits/stdc++.h>
using namespace std;
int n;
int s[200];
int main()
{scanf("%d",&n);int sum=1;for(int i=0;i<n;i++){sum*=2;}for(int i=1;i<=sum;i++){scanf("%d",&s[i]);}int z1=0,z2=sum/2+1;for(int i=1;i<=sum/2;i++){if(s[i]>s[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);elseprintf("%d",z1);return 0;
}
问题三:电子表格
题解:类似于2进制,8进制,14进制的题目,这题没有任何算法,但是数据的恶心程度已经超过了你的想象。
A代表1,Z代表26,以此类推,所以你以为这就是简单的26进制题吗?NO,因为没有任何一个字母会去表示0,所以是一个隐藏的27进制的题目 (ps:确实有够抽象的,栽了一回)
#include<bits/stdc++.h>
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检查数组里面是否有Cflag=0;//用于处理R23C55——转成另外一种elseflag=1;if (flag){i=0;r=0;c=0;for (i=0; i<len; i++){if (isalpha(a[i]))c = 26*c+(a[i]-'A'+1);else if (isdigit(a[i])){if (r==0){printf("R");r=1;}printf("%c",a[i]);}}printf("C%d\n",c);}else{for (i=1; i<len; i++){if (i<strchr(a,'C')-a)r = 10*r+(a[i]-'0');else if (i>strchr(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;elsec=c/26-1;i++;}for (i=i-1;i>=0;i--)printf("%c",s[i]);printf("%d\n",r);}}return 0;
}