ACM程序设计基础第三周学习总结与感悟

一、学习总结
1.在vjudge上面写题时,格式输出是很严格的,若提交代码之后出现PE(presentation error),结果是过关的,但是格式出现错误,应该检查输出的格式是否与题目相符,增加或者删除(不)必要的空格以及换行符,另外空白符可以与字符数字一起放在双引号里组成字符串。
注意:当输出多个数据,每个数据都要用一个空格分开时,应该利用if语句先检查要输出数据的次序,第一个直接输出,后面的输出cout<<" “<<输出结果,若要是直接cout<<输出结果<<” ";则会造成最后一个数据后有冗余的空格。
2.在写某些贪心算法时,若题目要求记录或者检查这个数据的情况,应在定义结构体包含此数据的同时定义bool类型,来反映和记录这组数据是否符合题意,以及对数据做出变换(改变bool值)方便后面的记录,如例题打牌问题需要记录打过的牌,以及写作业罚分问题需要利用bool值记录分值较低已交换的作业。
3. 判断奇偶数的方法:
(1)对2取余法:若等0位偶数,若等1则为奇数
(2)位操作作(速度更快):N&1=1时(N为奇数) N&1=0时(N为偶数)

4.贪心分为两种:(1)单情况:对此情况的多段贪心(2)多情况:对每个情况的每个阶段都贪心,再取每个情况的最优解(类似于动态规划)
5.sort函数自定义cmp函数对数组只排大小不改变数值对应下标:定义一个下标数组,排序时传的时候传下标进行对数组排序可以实现对数组的不变下标排序,具体如下:

include<iostream>
include<algorithm>
using namespace std;
inline bool cmp(const int &i1,const int &i2)
{
    return a[i1]>a[i2];
}
int main()
{
     int a[10000],n,id[1000];
     cin>>n;
     for(int i=0,i<n,i++)
     {
          cin>>a[i];
          id[i]=i;
     }
      sort(id,id+N,cmp);
      for(int i=0,i<n,i++)
      cout<<a[i];
      return 0;
}

6.差分法:
差分:就是将数列的每一项与前一项的数做差(第一个数字与零做差),差分得到的序列比原序列多一个数,即最后一个是0与原数列最后一个作差结果
性质:(1)差分序列求前缀和可得到原序列
(2)将原序列区间[L,R]中全部的元素+1,可以转化操作为差分序列L处+1,R+1处-1
(3)按照性质2得到,每次修改原序列一个区间+1,那么差分序列修改处增加的和减少的相同

二、学习感悟
通过这周对贪心算法题目的强度刷题,渐渐的适应了这种思维方式,掌握了这种单情况多步骤的贪心题目的做题方法,核心思想就是先对乱序数据进行排序,按照一定的贪心策略对每个步骤进行贪心,最后得到最优解。
1.我慢慢还学会如何自己调试程序,修改程序,通过做题,当题目出现wronganswer
时就是程序的哪一步的逻辑思维和计算机的逻辑思维出现偏差,我会从上往下逐步调试每一步的结果,先将下面的语句块通过//注释掉,检查上面的语句是否出现错误,依次进行检查,最后找出哪一块出现错误
2.vjudge上的题目的数据类型定义是非常严格的,有的题目某些数据有特殊要求时,要注意在定义数据类型的选择,对于整数较大的数据要区分int 和 long long的数据类型的区别,对于小数,要区分float(单精度浮点数,精确到6-7位)和double(双精度浮点数,精确到15-16位)例如计算奶牛的叫声(较大数字)的题目时,要注意对整数的定义类型
3.遇到动态数据求最值的贪心时可采用以下三种方法存放数据:
(1)优先队列(优点:当改变数据时,队列数据的最大数自动排到队头)
(2)set容器(优点:在插入或者删除元素时,它会自动调用二叉树对数据进行排序)
(3)map容器(优点:对数据自动排序,速度较快,可以和pair相结合)

上一篇:ACM(第三周)


下一篇:mockjs 笔记