- 1001
- 1002
- 1003
- 1004
- 1007
- 1009
- 1010
- 1)注意数据最多十位,可能会溢出,建议使用long long;
- 2)题目虽然给出的表示方式最多到36进制,但是求一个进制可以满足两数相等时,所求的进制可以大于36;如一个数的十进制值为39,给定另一个数为10,则当其为39进制时,这两个数相等,这是满足条件的。
- 3)进制的最小值radix应该大于(不包括等于)数据各位中最大的一个数
getMax(string n2)
;而其最大值应该小于等于max(getMax(n2) + 1, n1); - 4)由于n1的值可能很大,所以采用遍历的方式可能会造成超时(事实证明确实超时了,但是仅有一个样例超时,所以在不求满分时,可以使用这样的方式);为了节省时间并通过全部样例,则可以采用二分查找的方式。
1001
- cin 后的 cin >> num输入无效
解析:cin在被核定为false后将不再执行,可cin.sync()和cin.clear重置;
解决方式:此题中使用该方式后发现无效;检查输入数据后发现将double类型的数据输入到int的变量中,从而导致了这个问题。
1002
- 多项式的概念问题
N和aN分别是多项式的指数和系数,当系数为0时,这一项会消除
1003
1)int a[10] = {0}的方式只能初始化为0;
若为 int a[10] = {1}
则初始化结果为 1, 0, 0, ...
;无法真正完成初始化
数组初始化的方式:
1)memset函数,位于string.h
头文件中,但是一般只用来初始化0和-1,因为其为按字节赋值;
2)fill函数,位于algorithm
头文件中,可以用来初始化为对应范围内的任意值;
注意:
int a[10];
int b[10][10];
memset函数
#include <string.h>
memset(a, 0, sizeof(a));
fill函数
#include <algorithm>
fill(a, a + 10, 100);
fill(b[0], b[0] + 10 * 10, 100); //注意二维数组初始化时首地址为b[0]
2)一定要仔细区分=
和==
,if的条件判断里不能写错了
3)Dijkstra算法
Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。
1004
1)解题思路:dfs或者bfs
2)对于题目中规定首节点为1而不是0的,最好数组使用时将0空出(也可以全部-1,但是这样容易导致中间概念出错)
3)由于设计层数,使用dfs递归的方式更容易一些,可以将depth直接作为递归变量;而使用bfs则需要输入后保存每个节点的层数(也是根据父节点层数+1)
注:bfs的实现只通过了部分样例,暂时未找到错误原因;
1007
1)可以使用vector来代替全局变量数组;
2)看清题目,这里是输出最大和,以及子序列的第一个和最后一个的值(而不是序号);所以英语能力也需要提升。
1009
问题:多项式相乘
相似题:1002
1)多项式概念,当多项式相乘后若某一项系数为0,则该项消除;
2)思路:将两个多项式各项相乘,结果按N大小排序并合并同类项(注意消除系数为0的项),输出即可;
3)更多思路:由于N限制在0~1000,所以可以直接设置double型数组arr[1000],用来表示密级对应的系数,在第二个多项式输入时,直接for循环和第一个多项书各项(a, b)相乘得到结果ans[a + j] = arr[j] * b;
但通过提交后的时间来看,我的原本思路方式要由于这种方式
1010
思路:将已给进制的数转化为10进制数,然后对于另外一个数通过遍历的方式找出某一进制符合这两个数相等即可。