记录题目中遇到的坑

1.尽量用scanf和printf,不用cin和cout(太慢了),除非用

std::ios::sync_with_stdio(false)

取消同步
例题:http://poj.org/problem?id=1182(考察并查集,时间卡的很死)

2.高精度问题,看到问题中要输入1000个digits的数字表示高精度数字,如下描述:
Each input file contains one test case which gives a positive integer no more than 1000 digits.(警觉)
高精度资料模版:
https://www.cnblogs.com/ECJTUACM-873284962/p/6509429.html
例题:
https://www.patest.cn/contests/pat-a-practise/1136(模拟水题+高精度)
3.遇到输入digit的,转化为数字要小心,0000,-0000这类数字,
首先用char*去接受,然后在转化成数字。
最后输出的时候,要利用printf(“%04d”)打印数字显示digit,不要轻易改变循环中的数字,
要用临时变量去替代一下:
例题:
https://www.patest.cn/contests/pat-a-practise/1139(暴力+广搜)

注意for(int i;i<..;i++)
后面一定是i++,不能用其他字母代替进去
还有一个在while循环里面记得将循环变量进行迭代

四.c++结构体的用法

struct node
{
    int value,cnt;
    node(int a, int b):value(a),cnt(b){} //初始化列表
    bool operator <(const node& a) const //重栽比较操作符<,用于set和map的排序操作
}

set不能有重复的key值。所以,计算词频的时候需要删掉再添加进去。

迭代器使用:
set<..>(数据结构)::iterator it;

set.insert(插入数据)
set本身是利用红黑树实现的,你可以用你自己的排序方法进行排序
具体题目:https://www.patest.cn/contests/pat-a-practise/1129

6.关于树的数据输入,以及深度搜索:
关于数据给予这样的形式:数据 左树索引 右树索引
如果是深度搜索遍历的话,就只要根据数据进行深度搜索就行。
往往列表中没有出现的索引就是树根。
注意:语法树的不会出现有右结点,没有左结点的情况。
例题:https://www.patest.cn/contests/pat-a-practise/1130

7.关于图的最优路径
注意:
一.如果是点到点,直接对图进行深度搜索就好
深搜格式:

void dfs(int start,int end,int cnt,int& mincnt,int& minTransfer)//(后面利用int&引用来保持递归变量)
{
    //更换值
    if(start==end && cnt<=mincnt)
    {
        int Transfer=cntTransfer(temppath);
        if(cnt<mincnt || (cnt==mincnt && Transfer<minTransfer) )
        {
            mincnt=cnt;
            minTransfer=Transfer;
            path=temppath;
        }
    }
    //递归退出
    if(start==end) return;
    //dfs搜索
    for(int i=0;i<v[start].size();++i)
    {
        //确认是有没有访问过
        if(visit[v[start][i]]==0)
        {
            visit[v[start][i]]=1;//说明访问过
            temppath.push_back(v[start][i]);//存储路径
            dfs(v[start][i],end,cnt+1,mincnt,minTransfer);//递归
            visit[v[start][i]]=0;//出栈,说明没有访问过
            temppath.pop_back();//出栈
        }
    }
}

例题:https://www.patest.cn/contests/pat-a-practise/1131

二.一对多:Dijstra算法,注意和路径还原相结合,具体见《挑战程序设计竞赛》
Dijstra算法流程:

cost[N][N];//邻接矩阵
d[N];//到每一个点的距离(初始为INF)
used[N];每个点是否被访问过(初始为false)
prev[N];用于路径还原(开始点为-1)
d[start]=0;
while(true)
{
    v=-1;
    //找出当前路径值最小的结点
    for(int i=0;i<V;++i)
        if(!used[i] && (d[i]<d[v])) v=i;
    //全部访问完,结束
    if(v==-1) break;
    used[v]=true;
    //利用周围所有结点的具体对该结点进行更新
    //路径还原的话,就要一个prev[N]保存它的更新后的前继结点
}


vector<int> findpath(int t)
    vector<int> path;
    //-1说明为开始结点
    for(;t!=-1;t=prev[t]) path.push_back(t);
    reverse(path.begin(),reverse.end());//进行反转就好

三.多对多:Flory算法:三重循环,主要依靠松弛操作(三角不等式:a[i][j]=min(a[i][k]+a[k][j])),数据最好是矩阵形式。

8.利用图判断欧拉回路或者有利用到图的度数的时候,一定要判断图是不是连通图,判断连通图的依据是深搜,判断深搜的结点数是否等于总结点数,深搜代码:

//欧拉回路必须判断一下图的连通性
void dfs(int node,int& cnt)
{
    cnt=cnt+1;
    visit[node]=1;
    for(int i=0;i<G[node].size();++i)
    {
        if(visit[G[node][i]]==0)
        {
            dfs(G[node][i],cnt);
        }
    }
}

9.关于并查集的两道题目(特别铭记):出现并查集一般都是因为要搜索各个人物之间的关系,是不是属于同一类,是不是属于同一个家庭。
https://www.patest.cn/contests/pat-a-practise/1118
https://www.patest.cn/contests/pat-a-practise/1114
10.里面的二叉树经常是相等的直接插在树的左结点上,注意这里是深度搜索:
https://www.patest.cn/contests/pat-a-practise/1115

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值