20200601(线性分类器)


思路
我们要设计一个函数classify 用来根据输入的点和直线确定点在这个直线的哪个区域:0/1。我们设置一个数组duiying[][],duiying[i][j] 表示第i条直线在第j条区域应该是分类A还是分类B,对于每个直线,我们考虑每个点,计算出它在该直线下的区域,然后该区域下对应的类型和该点的类型是否相同。
代码1
1 |
|
20200602(稀疏向量)


代码1
把(index, value)记录在数组当中,这样两个向量就用两个数组vec1, vec2表示了,用i, j 表示两个数组的下标,若两个index相同,则累加结果,然后i++, j++,否则,较小的index对应的数组下标递增。
1 | //freopen("D://input.txt","r",stdin); |
超时了,80分。原因是,用cin进行输入,在数据量很大时, cin比scanf慢了很多倍。
20200603(Markdown渲染器)




代码1
我将计算段落和项目的行数的任务交给了dealSeg(int beg, int ed)函数和dealItem(int beg, int ed)函数,只要给出输入的段落或项目所在的开始行和结束行,就可以正确算出来,前提是不要把开始行和结束行输入错了。接着,就可以把精力集中在段与段,段与项目,项目与项目之间该如何处理了。我们用pre标识前面处理了什么类型,pre=-1表示前面什么都没处理,也就是说刚开始,pre=0表示前面处理了段落,pre=1表示前面处理了一个项目。其实,在我的设计中,如果很多个连续的项目后跟了至少一个空行,那么这些项目可以看做是段落,见代码的109行。
- 若遇到了段落,则只要pre!=-1,就无脑递增行数
- 若遇到了项目。若前面发现有空行,如108-111行所示,且前面处理了项目,则递增行数;若前面处理了段落,则递增行数。
对于dealSeg与dealItem函数,注意去掉每行的收尾的连续空格。
1 | //freopen("D://input.txt","r",stdin); |
超时,80分。原因是输入太慢了,用ios::sync_with_stdio(false)
20200604(1246)

代码1
通过一个循环,计算出第n秒的串是什么(我知道,存储容量肯定不够,2的10亿次方,自己算一下这有多大),然后用正则表达式计算包含了多少个S串。
1 | //freopen("D://input.txt","r",stdin); |
超时,32分。
代码2
数字中只可能函数有1, 2, 4, 6,根据观察只可能产生的1数位和2数位是{1,2,4,6,16,26,41,42,44,46,61,62,64,66}。因此我们就对一个串,比如6416,看它可能产生哪些数位,以6416为例,6可以产生6,4,64; 4可以产生1,6,16; 1可以产生2; 6可以产生6,4,64; 64可以产生6,4,1,6,64,41,16,但是其中的6,4,64,1,6,16和6与4产生的重合了,所以就只剩下41; 41可以产生1,6,2,16,62,但是1,6,16,2和4与1产生的重合了,所以就剩下62; 16可以产生2,6,4,26,64,但是2,6,4,6,4和1与6产生的重合了,所以就剩下了26。所以最终结果是1,4,4,6,6,6,16,26,41,62,64,64,观察6416的下一个串6416264,结果一模一样。
我们可以设置一个矩阵mat,(14,14)的,保存每个数位在经过一次变换后得到的数位,比如16经过变换后得到26(要去掉与1和6重合的部分,所以才只有26一个)。我们可以设置1的id是0, 2的id是1, 4的id是2,等等,这样就可以方便将变换关系保存在mat中。
经过每次变换,我们都保存结果串中每种数位有多少个,比如说16对应的就是,1有1个, 6有1个,16有1个。这样,可以用一个数组int initMat[14] 来保存这个信息。如何计算每次变换后,每种数位有多少个呢?我们有变换矩阵,有目前每种数位有多少个(intMat),可以计算出来的。经过思考,initMat*mat 就是可以产生这个结果。如果要经过n次变换,就让initMat乘以n个mat。
为了效率,我们可以快速幂的方法加速上述运算。
1 | //freopen("D://input.txt","r",stdin); |
96分。果然这题,又涉及到long long相关的错误。
20200605(乔乔与牛牛逛超市)
代码1
这题的做法可以总结为“水平选择,纵向贪心”。我们用邻接表发来建立商品与商品之间的关系,若有(x->y,1)边,则意味着必须有y,才能有x;若有边(x->y,2)边,则意味着必须要有y,x才能买正好$L_y$ 和 $R_y$ 件。我们建立一个vector\
只有x被购买了,y才能被购买 意思不是先买了x,再买y,而是x和y可以同时买,也满足这个条件。
代码2
代码1的思路没法做,原因是每个点可能依赖很多个点,而且有不同的依赖类型,没法向下做了。