今儿想想之前做的题忘得差不多了,还有一堆漏洞,好好梳理一下吧。以后每十道总结一次,代码和方法一定要熟悉。
A1001 A+B Format
无……
A1002 A+B Polynomials
设置输出精度
cout<<fixed<<setprscision(小数点位数)<<num……
A1003 Emergency
图论问题
定义较大的数组放在main函数之前
数组初始化
fill函数 头文件是 可初始化为任何数,任何位置
fill(first,last,val)
//一维数组D[n] fill(D[0],D[0]+n,1)
//二维数组D[n][n] fill(D[0],D[0]+n*n,1)
memset函数 头文件<string.h> 仅仅可以初始化0 -1
memset(name,0/-1,sizeof(name))
//一维数组D[n] memset(D,0/-1,sizeod(D));
Dijkstral算法
int G[maxn][maxn]; //图
int d[maxn]; //起点到此点的距离
int vis[maxn]; //标记是否访问
int weight[maxn]; //点的权重
int w[maxn]; //到每个点的最短路径的累计权重
int num[maxn]; //到每个点的最短路径条数
int N, M, C1, C2;
void Dijkstra(int s) {
//s一般是起点
d[s] = 0;//其余点d=inf
num[s] = 1;
w[s] = weight[s];//其余点weight都是0
for(int i = 0; i < N; i++) {
int u = -1, MIN = INF;
for(int j = 0; j < N; j++) {
if(vis[j] == false && d[j] < MIN){
u = j;
MIN = d[j];
}
}
if(u == -1) return;
vis[u] = true;//第一遍仅仅能找到起点 即u=s
for(int v = 0; v < N; v++) {//第一遍寻找与起点相邻的点 后面把这些点看做中间点进行查找
if(vis[v] == false && G[u][v] != INF){
if(d[u] + G[u][v] < d[v]) {
d[v] = d[u] + G[u][v];
w[v] = w[u] + weight[v];
num[v] = num[u];
} else if (d[u] + G[u][v] == d[v]) {
num[v] += num[u];
if(w[u] + weight[v] > w[v]) //当路径长度相同时,只需记录较大的权重即可,因为最后只需输出权重
w[v] = w[u] + weight[v];
}
}//if
}//for - v
}//for - i
}//Dijkstra
A1004 Counting leaves
DFS深度优先遍历
DFS+回溯:
void dfs(int x,int f)
{
if(vc[x].size()==0)
{
vis[f]++;//f是层数 vis记录每层的叶子数
mx=max(mx,f);//记录最高层数
return ;//返回根节点 继续探索
}
for(int i=0;i<vc[x].size();i++)
{
dfs(vc[x][i],f+1);//向下探索子结点 同时层数加一
}
}
A1005 Spell it Right
int 和 string 互换
int a;string b;
a=b-'0';//stirng转Int
int c;string d;
d=to_string(a);//int转string
A1006 Sign in & Sign out
没啥好写的……
A1007 Maximum Subsequence Sum
动态规划
dp[0]=a[0];//初始化
for(int i=1;i<n;i++)
{
if(dp[i-1]+a[i]>a[i])
{
dp[i]=dp[i-1]+a[i];
s[i]=s[i-1];//仍采用之前的起始位置
}
else
{//说明dp[i-1]<0
dp[i]=a[i];//序列重新从a[i]开始
s[i]=i;//s储存的是序列起始位置
}
}
int k=0;
for(int i=1;i<n;i++)
{
if(dp[i]>dp[k])//寻找最大和
{
k=i;记录初始位置
}
}
A1008 Elevator
没啥好写的……
A1009 Product of Polynomicals
复习过程中,找到了错位,刷到了满分哈哈哈哈哈,错就错在范围小了,所以做题尽量给足够大的范围……
有个技巧就是边输入边计算,这样节省空间和时间。
A1010 Radix
二分法
for(;low<=high;)//二分搜索
{
aimRadix=(high+low)/2;
tempAns=charToDecimal(as,aimRadix);
if(tempAns==-1||tempAns>aimNum)
high=aimRadix-1;
else if(tempAns<aimNum)
low=aimRadix+1;
else
{
flag=true;
break;
}
}
总结了好久啊……哈哈哈哈哈记忆加深的同时能发现新的问题,开熏!
继续加油哦!