2019-10-18好记性不如烂笔头

今儿想想之前做的题忘得差不多了,还有一堆漏洞,好好梳理一下吧。以后每十道总结一次,代码和方法一定要熟悉。

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;
        }
    }

总结了好久啊……哈哈哈哈哈记忆加深的同时能发现新的问题,开熏!
继续加油哦!

发布了42 篇原创文章 · 获赞 16 · 访问量 2876

猜你喜欢

转载自blog.csdn.net/weixin_44412218/article/details/102624637
今日推荐