C++阶段性总结

这段时间学了不少东西,但是自己真正学到的并没有很多。有一些地方因为自己的基础不牢固也没有真正搞清楚。知道自己要下功夫学习但是在家里的慵懒实在让我错付了很多美好的时光。虽然近期有所好转但是之前拉下的课根据课程回放也学到了一点。唉,后续自己还是要摆正自己的态度、更加自律才是。

《一》递归算法
一、
1、把大型复杂的问题,层层分解得到规模小的小问题来求解
2、基本思想:层层分解
二、步骤
1、分析问题,寻找递归;找大规模和小规模之间的关系
2、找出停止条件
3、设计函数,确定参数
三、求1-100
递归:fn(n)=n+fn(n-1)
终止条件:f(1)=1
代码:int fn(int n){
if(n<=1) return 1;
else
return n+fn(n-1);
}
注意:先处理终止条件,作为单独的项来处理。
注意:①出口;②形参要与递归对应(数据规模)-递归关系的表示(返回值)。
1、在主函数中调用,层层调用。
2、返回值时得到小规模的解才行(逐步回溯,求解)
四、作用
在调用中使问题简化,回溯过程得到问题的解。
3.1.2集合的全排列
一、
1、先排高位,再关注少一位
2、大问题化小
3、列举所有高位情况,来确定子问题
4、需要枚举!(重要)
3.3全排列的递归算法
1、至少需要两位以上。
2、举例从k-m的数据全排列(多种情况就枚举)
3、递归调用,做全排列
4、恢复原来的数据-数据交换(重要)(二次交换-枚举重要问题)
3.3.8半数集
求几个元素
半数集是多重集
用到递归,不忘关系原来的数
【注意】使用数组存储计算过的结果,避免重复,提高效率
3.3.12记忆化搜索
已知结果记录-加数组

《二》复合数据类型
一、
1、定义结构体变量的格式:
struct 结构体类型名 变量名列表;
//
struct 类型名{
数据类型1 成员名1;
数据类型2 成员名2;
。。。
} 变量名
2、多的变量用数组
3、同种类型可以放在一起
4、赋值时交换为整体交换

二、重载运算符
在结构体内定义成员函数时,对成数据成员的操作,省略结构体变量。
重载<运算符,来作比较
compare函数来作比较。
三、指针和引用
1、定义指针时,应该先对指针进行初始化
2、同类型的指针可以进行相等和不相等的比较,比较的结果是布尔类型
3、指针可以进行加或者减的整数值的运算
4、自增、自减运算适用于指向数组元素的指针
5、c++通过new和delete进行动态存储空间的管理

《三》类和对象
一、
1、类的数据成员可以是其他类的对象,但不能以类自身自身的对象作为本类的成员,而类自身的指针和引用可以作为类的成员
2、类定义完以;结束
3、类与结构体的区别:没有明确指定类成员的访问权限时,c++结构体的成员是公有的,而类的成员是私有的。
二、
1、构造函数一定要重载
2、函数重载:函数名相同,但参数类型或者个数不同的一组函数。 编译器根据不同参数的类型和个数产生调用匹配 。函数重载用于处理不同数据类型的类似任务
3、构造函数至少要包括两个,其中一个是不带参的
4、构造函数创建对象时,通过指针和new来实现,一般语法为:类名 *指针变量 = new 类名[(实参表)]
5、必须使用参数初始化列表对数据成员进行初始化的几种情况:
数据成员为常量; 数据成员为引用类型; 数据成员为没有无参构造函数的类的对象。
三、类的包含(类的组合)
当一个类中含有已经定义的类类型成员,带参数的构造函数对数据成员初始化,须使用初始化语法形式。
构造函数 ( 形参表 ) : 对象成员1(形参表 ) , … , 对象成员n (形参表 ) ;
若定义了类A,类B包含了类A:
class B
{
private:int b;
A aa;//不能加括号

};

《四》递归算法
1、最优的求解算法,层层分解成子问题(每次一般只有一个),由子问题的最优解回溯到整个最优解
2、考虑局部最优——》整个问题
3、条件
①是否符合
②贪心标准的选择(怎么求局部最优解
4、最优装载问题
策略:最轻最先装
找最优问题,定义结构体
排序,增加函数(compare/比较函数-返回值布尔类型
——取真值表示不变,假值调换
memset(0/1),使用——清零
给集装箱编号
排序(贪心策略)【第二个函数是无效函数的下标开区间,第一个是闭区间】
5、背包问题-装满-价值最大
三种方法(装大东西,装价值大,装性价比)
结构体描述背包
排序银子(性价比降序)【次序的改变与不变】
使用标准模板库函数排序(最好是stable_sort())
用剩余容量来选择,再选择价值
如果要获得解向量X={x1,x2,x3…},则需要在数据结构中加入物品编号 int index——要处理进数组
6、货币找零
最少量变——先用纸币面积大的去找
货币升序排列——从大下标到小下标
6、间调度问题

(在可选工作中,每次都选取结束时间最早的——应遵循的规则)

1】将所有工作按照时间早晚排序

2】顺序选择工作,不冲突则可

const int n=5;

int S[n]={1,2,4,6,8};

int T[n]={3,5,7,9,10};

pair<int,int>itv[n];//对工作排序的pair数组(把两项内容组织一起)

int solve()

{

//为了让结束时间早的工作排在前面,把T存入first,把S存入second

for(int i=0;i<n;i++){

itv[i].first=S[i];

itv[i].second=T[i];

}

sort(itv,itv+n);//升序排列
int count=0;//选取结果

int t=0;//最后所选工作的结束时间

for(int i=0;i<n;i++){

if(t<itv[i].first){//根据t选择新工作

count++;

t=itv[i].second;//时间按增加

}

}

return count;

}

int main(){

int k=solve();

cout<<k<<end;

return 0;
7、字典序最小问题

(指从前到后比较两个字符串的大小的方法,首先比较第一个字符,如果不同则第一个字符较小的字符串更小,如果相同则继续比较第二个字符。。。。反复继续来比较)

1】从首部选相当于上移,从尾部选相当于下移

2】最开始用数组来存放源串

3】循环语句来把字符串比较(从头取还是从尾取——找出能比较大小的字符

4】头尾两边谁大输出谁,
8、分发饼干

(大尺寸的饼干分给胃口大的孩子)

1】写一个函数做解决方案,两个形参加向量,胃口是g,饼干是s

2】bagin()返回起始地址

end()返回最小的无效地址

3】size()取得向量元素

4】循环语句

for(int i=g.size()-1;i>=0;){//从大往小取

if(index>=0){//在饼干分配时考虑合不合适

if(g[i]<=s[index]){

res++;

index–;

}

i–;

}//饼干没了就结束

else break;

}

8、小船过河问题

(先将所有人过河所需要的时间按照升序排序,我们考虑把单独过河所需要的时间最多的两个旅行者送过去,有两种方式:①最快的和次快的,然后最快的划船回来;最慢的和次慢的,然后次快的划船回来,所需时间:t【0】+2t【1】+t【n-1】

②最快的和最慢的过河,然后最快的划船回来,最快的和次慢的过河,然后最快的划船回来,所需时间:2t【0】+t【n-2】+t【n-1】。

1、while(t–)//两种方式

{

scanf("%d",&n);

sum=0;

for(int i=0;i<n;i++) scanf("%d",&a[i]);

sort(a,a+n);

while(n>3)

{

sum=min(sum+a[1]+a[0]+a[n-1]+a[1],sum+a[n-1]+a[0]+a[n-2]+a[0]);

n-=2;

}

if(n3) sum+=a[0]+a[1]+a[2];

else if(n2) sum+=a[1];

else sum+=a[0];

printf(“%d\n",sum);

}
9、POJ-1862-Stripies

每次先找两个计量较大的物体碰撞

通过优先队列来做(最前面的元素为最大值

double a=q.top().val; q.pop();删掉元素,剩余元素重新排列(不删不排)
10、HDU3183 A Magic Lamp

在n位数中选M位,最小

第一位在【1,M+1】中选最小的,上限为M+2;

while(scanf("%s%d",num,&m)!=EOF)

{//每次选一位

t=0;k=0;

int len=strlen(num)-m;//选n-m位//m为截至位

while(len–)

{

temp=t;//t为开始位置

for(int i=t;i<=m;i++)//找最小数的下标

{

if(num[temp]>num[i])

temp=i;

}

//把对应数字给他赋值
10、HDU 1388 Game Prediction

(最多输max次,至少赢n-max次,用对方的最小的牌依次比较自己手中的牌(升序),如果找到有比它小的,则对方赢一次,依次循环直到遍历完对方的牌
11、zoj 3627 Treasure Hunt ll

(枚举两个人最开始走到相距m处的左右两点位置,然后再看剩下的时间还可以再继续一起往左或者往右继续走多远,最终取得最大值的情况即可。需要注意边界的处理。)

先输入n个城市,sum【0】=0;

处理前缀和:sum【i】=sum【i-1】+val【i】;

调用函数(确定一种获得最多金币的策略)

for(int i=1;i<=n/2;++i)

swap(val[i],val[n+1-i]);//把数组元素逆序

学到的东西距离要求还差很远,我应该抛弃懒惰,更加自律,在上课的时候宛如在学校那样。争取考试取得好成绩。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值