洛谷刷题感想记录

洛谷刷题感想记录


1). 2为素数,在需要判定素数的题目中一定要注意2的额外情况!找素数列表一般直接从2开始找起
2). 问题:递归里的参数什么时候初始化?
3)
//三叉树的深搜示例,但是tlm了,怎么剪枝?

#include<bits/stdc++.h>
using namespace std;

int print[1000]={0};
void choose_num(char *l,int k,float t1,float t2,char* keep,int index,bool* vis){//t1,t2表示倍数,在层间传递的参数需要写为递归参数

    if(k==0){//三个数字选完了
        bool use[10]={false};
        int k0=keep[0]-'0';
        int k1=keep[1]-'0';
        int k2=keep[2]-'0';
        use[k0]=true;
        use[k1]=true;
        use[k2]=true;
        int cnt=3;//验证数字是否被重复使用了

        int ans=(k0)*100+(k1)*10+k2;
        print[ans]++;
        if(print[ans]>1) return;
        
        int temp2,temp3;
        int ans2=temp2=int(ans*t1);
        int ans3=temp3=int(ans*t2);


        while(temp2!=0){
            int t=temp2%10;
            use[t]=true;
            cnt++;
            temp2/=10;
        }

        while(temp3!=0){
            int t=temp3%10;
            use[t]=true;
            cnt++;
            temp3/=10;
        }

        int flag=1;//是否全部用完数字
        for(int i=1;i<10;i++){
            if(use[i]==false)
                flag=-1;

        }
        if(flag==1&&cnt==9){//是第一次出现的数才进行打印
            printf("%d %d %d\n",ans,ans2,ans3);
        }

        return;

    }//if

    for(int i=1;i<10;i++){

        if(vis[i]==false){
            vis[i]=true;
            keep[index]=i+'0';//dfs怎么剪枝?
            choose_num(l,k-1,t1,t2,keep,index+1,vis);
            choose_num(l,k-2,t1,t2,keep,index+2,vis);
            vis[i]=false;//记得还原为false!
        }

    }
    return;
}


int main(){

    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    float t1=float(b)/a;
    float t2=float(c)/a;
    char l[10]={'0','1','2','3','4','5','6','7','8','9'};
    char keep[3];
    int index=0;
    bool vis[10]={false};
    choose_num(l,3,t1,t2,keep,0,vis);

    return 0;

}

4)next_permutation(a+1,a+10));//STL中的下一个排列函数
5)递归的时候深层参数无法修改外层的!
6)当遇到有关于加法、奇偶数数时,记得分析一下再考虑遍历/递归等
7)当出现运行时错误时,考虑将++号修改为无缩写的形式,在递归参数中不要写++的形式
8)typedef long long ll; 对较大数进行递归时记得将数据类型定义为ll
9)对数组元素进行初始化memset(r,0,sizeof®);
10)D:\机试\超级玛丽\main.cpp|10|error: stray ‘\342’ in program|表示出现了中文字符
11)在有过大的输入时记得进行预处理p1464
if(a>20) a=21;
if(b>20) b=21;
if(c>20) c=21;
12)注意若定义数据为ll型,输入方式也就要定义为ll
13)结构体定义&&重构运算符

struct mem{
    int time=0;
    int word=0;
    bool operator < (const mem &b) const{
        bool i;
        if(time<b.time)
            return true;
        else return false;
    }


    }memo[100];
//sort(memo,memo+m);排序,升序,所以重构小于运算符

14)一定要根据数据类型进行打印float类型用%f打印 否则用%d打印为0
15)只有奇数为素数(除了2以外)
16)一定要注意数组大小为字符数目+1
17)sort(va.begin(), vec.end());对结构体进行排序 vector
18)对于有要求绝对值最小的才进行输出的情况,需要分负数正数分开讨论(p1023)
19)模拟的巧妙题解(p1031)把变动条件变成了某边界条件
20)常识:打球时单人打满11球才算一局
21)printf("%s",s.c_str()); //s为string类型
22)find(bl[0],bl[strlen(bl.c_str())],i)==string::npos//其中bl为string类型,string为c++类型,而%s/strlen全部是c相关,需要将string变成char才可以使用
return vec.end()-1; //获取vector容器的最后一个元素
23)快速排序算法见p1117,一定要注意条件判断时为i<=j !!
24) queue 头–front();尾back()
25)sort(开始地址,结束地址+1);默认升序排列!注意是地址,而非元素本身!!!快速排序的算法你需要自己再背几次!
sort函数只能用于顺序容器,map是不可行的
26)p1217题!!偶数位数回文数(除11)必定不是质数(自行百度),所以只要运行到10000000
27)声明大数组必须要在main函数以外,声明为全局数组
28)int的范围是-2147483648~2147483647 (10^9)
29)结构体可以直接相互赋值,注意归并排序比快排更优化
30)strcmp用于比较char
类型
31)priority_queue<int,vector,greater > b;//小顶堆的建立,注意最红两个尖括号是分开的
32)char*与string可以通过直接赋值进行转换
33)全排列函数使用do while
do{
*****
}while(next_permutation(b,b+cnt));//cnt表示数目
34)当出现位数超过10时会溢出,出现负数,!!使用long long类型,long long类型不要与int比大小
35)p1803(在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分,问最大的k为多少。
最左边的线段放什么最好?
显然放右端点最靠左的线段最好,从左向右放,右端点越小妨碍越少
其他线段放置按右端点排序,贪心放置线段,即能放就放)
36)p1219八皇后 同在对角线上row+col的值相等,同在副对角线上row-col的值相等
37)p2000成语接龙,需要多看几遍(特别是龙的判断)

p1101 单词方阵p1605 迷宫(经典迷宫题) p1162 填涂颜色+之前的错题2
38)vector实现栈:获取top vector.back() 出栈pop_back() 入栈 push_back()
39)memset(outmaze,’
’,sizeof(outmaze));//二维数组初始化,记住需要写在main函数之中
40)结构体构造函数
struct keep{
int x=0;
int y=0;
char c=‘y’;
keep(int x,int y,char c):x(x),y(y),c©{}
};
50)queue:

定义queue 对象的示例代码如下:
queue q1;
queue q2;

queue 的基本操作有:
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()
51)vector
vector.back()//队尾元素
vector.push_back()//入队尾
vector.pop_back()//出队尾
52)
queue队列头front
队列尾 back
53)QUEUE不支持clear操作
清空队列:
queue empty;
swap(empty, A);
54)求二叉树的最大深度例题

#include<bits/stdc++.h>
using namespace std;
struct Node{
    int data=0;
    Node* lchild=NULL;
    Node* rchild=NULL;
};

typedef Node* node;
int len;
int dfs(node q){//从q结点进行遍历
    if(q->data==1) len=1;
    if((q->lchild)==NULL&&(q->rchild)==NULL){ return 1;}
    else{
        int len1=0,len2=0;
        if(q->lchild) len1=dfs(q->lchild)+1;
        if(q->rchild) len2=dfs(q->rchild)+1;
        len=(len1>len2)? len1:len2;//左右树较大的为最大深度
    }
    return len;
}

node T[1000000];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        T[i]=new Node;//建立结点,注意是new 结点,而非new结点的指针!

    for(int i=1;i<=n;i++)
    {
        T[i]->data=i;
        int a,b;
        cin>>a>>b;
        node p=T[a];
        node z=T[b];
        if(a==0) p=NULL;
        if(b==0) z=NULL;
        if(a!=0){
            p->data=a;
        }
        if(b!=0){
            z->data=b;
        }
        T[i]->lchild=p;
        T[i]->rchild=z;
    }

    dfs(T[1]);
    cout<<len<<endl;
}

55)使用结构体解决广度优先的计数问题
56)P1189DFS,注意vis三维数组的使用!没有搜索过的状态才进行dfs!
57)获取一整行string,getline(cin,b);(b为string类型)
cin无法获取空格or换行符
58)关于c++ find与substr
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值