CFF真题
【 201909-2 】小明种苹果(续)
思路
1.发生苹果掉落和疏果是两种不同的操作 发生苹果掉落(5 3) 疏果(5 -3)
2.一棵树可能出现多次苹果掉落的情况 比如:3 5 2 1(对于一棵树来说 有3个操作,原来有5个苹果,第一次掉落后还剩2个,第二次掉落后还剩1个)
3.当发生苹果掉落的苹果树的棵树大于等于3时才可能形成连续的三个苹果树
注意
a可能是10^6 所以采用long long
源代码
1 |
|
测试用例
4
4 74 -7 -12 -5
5 73 -8 -6 59 -4
5 76 -5 -10 60 -2
5 80 -6 -15 59 0
5
4 10 0 9 0
4 10 -2 7 0
2 10 0
4 10 -3 5 0
4 10 -1 8 0
3
3 10 2 1
2 10 -5
3 10 3 1
【201909-4】 推荐系统
思路
C++常用数据结构–STL ,照搬大佬的
使用map<int,set<pair<int,int> > > F保存所有数据,格式为map<Score,set<pair<Type,Commodity> > >
这样在容器内部首先会按Score排序,同一Score的先按Type排序,再按Commodity排序。
使用unordered_map<int,int>[50]保存编号到成绩的映射,格式为
unordered_map<Commodity,Score> G[Type]
这样指定Type和Commodity可以在F中迅速定位,从F中增删商品的时间度为O(log(Score的种数) * log(该分数的物品数))。
基础知识
map<class T1,class T2>特性:存储T1->T2映射的键值对,map先按照T1升序排序,再按T2升序排序,其中T1,T2可以是任意类(如:int、string、char或自定义类),T1值唯一,其插入删除的时间复杂度为O(log2)
unordered_map<class T1,class T2>特性:仅存储T1->T2映射的键值对,T1值唯一,其插入和删除的时间复杂度为O(1)
源代码
1 |
|
测试用例
1 | 2 3 |
【 201903-1 】 小中大
注意点:
涉及到四舍五入,以及小数点位数
源代码
1 |
|
测试用例
1 | 4 |
【 201903-2 】 二十四点
思路
方法一: 中缀表达式先构建表达树,后序遍历得到后缀表达式,然后计算结果
方法二:利用一个栈和一个字符串 得到后缀表达式,然后计算结果
参考 https://blog.csdn.net/fireflylane/article/details/83017889
将中缀表达式转换为后缀表达式
step1:初始化一个栈和一个后缀表达式字符串
step2:从左到右依次对中缀表达式中的每个字符进行以下处理,直到表达式结束
- 如果字符是‘)’,将其入栈
- 如果字符是数字,添加到s2中
- 如果字符是运算符,先将栈顶优先级不低于该运算符的运算符出栈,添加到s2中,再将该运算符入栈。当‘)’在栈中是,优先级最低
如果字符是‘(’,将栈顶元素出栈,添加到s2中,直到出栈的是‘)’step3:如果表达式结束,但栈中还有元素,将所有元素出栈,添加s2中
step4:将栈s2中元素依次出栈,即得到前缀表达式
后缀表达式的计算
后缀表达式没有括号,运算符的顺序即为实际运算顺序,在求值过程中,当遇到运算符时,只要取得前两个操作数就可以立即进行计算。当操作数出现时,不能立即求值,需要先保存等待运算符。对于等待中的操作数而言,后出现的先运算,所以需要一个栈辅助操作。
后缀表达式的运算过程如下:
step1:设置一个栈
step2:从左到右对后缀表达式中的字符进行以下处理:
- 如果字符是数字,现将其转化为数字,然后入栈
- 如果字符是运算符,出栈两个值进行计算。计算结果入栈
- 重复以上步骤,直到后缀表达式扫描结束,栈中最后一个元素就是表达式的结果。
方法三(比较巧妙,只适合本题没有括号的情况):提前考虑优先级 ,来源 https://blog.csdn.net/Dqmail/article/details/89318208
首先遍历表达式数组,当遇到x / 时 计算结果,例如 +AxB 算为 +0+(AxB)即: 原来的符号变成上一个符号,A位置变成0,B位置变成 A x B ,如果操作符在a[1],计算完后也需要改变为‘+’ ,最后再遍历一回数组依次相加减即可。
注意一点:首先是拿字符数组接收表达式,但如果直接拿字符相加减容易出问题,所以额外用整形数组保存数字。
源代码
方法一:
1 |
|
方法二:
1 |
|
方法三:
1 |
|
测试用例
1 | 10 |
【 201812-2 】 小明放学
题目背景
汉东省政法大学附属中学所在的光明区最近实施了名为“智慧光明”的智慧城市项目。具体到交通领域,通过“智慧光明”终端,可以看到光明区所有红绿灯此时此刻的状态。小明的学校也安装了“智慧光明”终端,小明想利用这个终端给出的信息,估算自己放学回到家的时间。
问题描述
一次放学的时候,小明已经规划好了自己回家的路线,并且能够预测经过各个路段的时间。同时,小明通过学校里安装的“智慧光明”终端,看到了出发时刻路上经过的所有红绿灯的指示状态。请帮忙计算小明此次回家所需要的时间。
输入格式
输入的第一行包含空格分隔的三个正整数 r、y、g,表示红绿灯的设置。这三个数均不超过 106。
输入的第二行包含一个正整数 n,表示小明总共经过的道路段数和路过的红绿灯数目。
接下来的 n 行,每行包含空格分隔的两个整数 k、t。k=0 表示经过了一段道路,将会耗时 t 秒,此处 t 不超过 106;k=1、2、3 时,分别表示出发时刻,此处的红绿灯状态是红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 t,此处 t 分别不会超过 r、y、g。
输出格式
输出一个数字,表示此次小明放学回家所用的时间。
样例输入
30 3 30
8
0 10
1 5
0 11
2 2
0 6
0 3
3 10
0 3
样例输出
46
样例说明
小明先经过第一段路,用时 10 秒。第一盏红绿灯出发时是红灯,还剩 5 秒;小明到达路口时,这个红绿灯已经变为绿灯,不用等待直接通过。接下来经过第二段路,用时 11 秒。第二盏红绿灯出发时是黄灯,还剩两秒;小明到达路口时,这个红绿灯已经变为红灯,还剩 11 秒。接下来经过第三、第四段路,用时 9 秒。第三盏红绿灯出发时是绿灯,还剩 10 秒;小明到达路口时,这个红绿灯已经变为红灯,还剩两秒。接下来经过最后一段路,用时 3 秒。共计 10+11+11+9+2+3 = 46 秒。
评测用例规模与约定
有些测试点具有特殊的性质:
前 2 个测试点中不存在任何信号灯。
测试点的输入数据规模:
前 6 个测试点保证 n ≤ 103。
* 所有测试点保证 n ≤ 105。
源代码
1 |
|
【201803-2】碰撞的小球
问题描述
数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处。有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒。
当小球到达线段的端点(左端点或右端点)的时候,会立即向相反的方向移动,速度大小仍然为原来大小。
当两个小球撞到一起的时候,两个小球会分别向与自己原来移动的方向相反的方向,以原来的速度大小继续移动。
现在,告诉你线段的长度L,小球数量n,以及n个小球的初始位置,请你计算t秒之后,各个小球的位置。
提示
因为所有小球的初始位置都为偶数,而且线段的长度为偶数,可以证明,不会有三个小球同时相撞,小球到达线段端点以及小球之间的碰撞时刻均为整数。
同时也可以证明两个小球发生碰撞的位置一定是整数(但不一定是偶数)。
输入格式
输入的第一行包含三个整数n, L, t,用空格分隔,分别表示小球的个数、线段长度和你需要计算t秒之后小球的位置。
第二行包含n个整数a1, a2, …, an,用空格分隔,表示初始时刻n个小球的位置。
输出格式
输出一行包含n个整数,用空格分隔,第i个整数代表初始时刻位于ai的小球,在t秒之后的位置。
样例输入
3 10 5
4 6 8
样例输出
7 9 9
注意点
碰撞之后转向,还要动。
两边都是墙壁。
源代码
1 |
|
【201803-3】 URL映射
问题描述
URL 映射是诸如 Django、Ruby on Rails 等网页框架 (web frameworks) 的一个重要组件。对于从浏览器发来的 HTTP 请求,URL 映射模块会解析请求中的 URL 地址,并将其分派给相应的处理代码。现在,请你来实现一个简单的 URL 映射功能。
本题中 URL 映射功能的配置由若干条 URL 映射规则组成。当一个请求到达时,URL 映射功能会将请求中的 URL 地址按照配置的先后顺序逐一与这些规则进行匹配。当遇到第一条完全匹配的规则时,匹配成功,得到匹配的规则以及匹配的参数。若不能匹配任何一条规则,则匹配失败。
本题输入的 URL 地址是以斜杠 / 作为分隔符的路径,保证以斜杠开头。其他合法字符还包括大小写英文字母、阿拉伯数字、减号 -、下划线 _ 和小数点 .。例如,/person/123/ 是一个合法的 URL 地址,而 /person/123? 则不合法(存在不合法的字符问号 ?)。另外,英文字母区分大小写,因此 /case/ 和 /CAse/ 是不同的 URL 地址。
对于 URL 映射规则,同样是以斜杠开始。除了可以是正常的 URL 地址外,还可以包含参数,有以下 3 种:
字符串
整数
路径
以上 3 种参数都必须匹配非空的字符串。简便起见,题目规定规则中
输入格式
输入第一行是两个正整数 n 和 m,分别表示 URL 映射的规则条数和待处理的 URL 地址个数,中间用一个空格字符分隔。
第 2 行至第 n+1 行按匹配的先后顺序描述 URL 映射规则的配置信息。第 i+1 行包含两个字符串 pi 和 ri,其中 pi 表示 URL 匹配的规则,ri 表示这条 URL 匹配的名字。两个字符串都非空,且不包含空格字符,两者中间用一个空格字符分隔。
第 n+2 行至第 n+m+1 行描述待处理的 URL 地址。第 n+1+i 行包含一个字符串 qi,表示待处理的 URL 地址,字符串中不包含空格字符。
输出格式
输入共 m 行,第 i 行表示 qi 的匹配结果。如果匹配成功,设匹配了规则 pj ,则输出对应的 rj。同时,如果规则中有参数,则在同一行内依次输出匹配后的参数。注意整数参数输出时要把前导零去掉。相邻两项之间用一个空格字符分隔。如果匹配失败,则输出 404。
样例输入
5 4
/articles/2003/ special_case_2003
/articles/
/articles/
/articles/
/static/
/articles/2004/
/articles/1985/09/aloha/
/articles/hello/
/static/js/jquery.js
样例输出
year_archive 2004
article_detail 1985 9 aloha
404
static_serve js/jquery.js
样例说明
对于第 1 个地址 /articles/2004/,无法匹配第 1 条规则,可以匹配第 2 条规则,参数为 2004。
对于第 2 个地址 /articles/1985/09/aloha/,只能匹配第 4 条规则,参数依次为 1985、9(已经去掉前导零)和 aloha。
对于第 3 个地址 /articles/hello/,无法匹配任何一条规则。
对于第 4 个地址 /static/js/jquery.js,可以匹配最后一条规则,参数为 js/jquery.js。
数据规模和约定
1 ≤ n ≤ 100,1 ≤ m ≤ 100。
所有输入行的长度不超过 100 个字符(不包含换行符)。
保证输入的规则都是合法的。
思路
一组string的vector存放数据,用“/”分割每条语句。
依次拿规则来匹配url,别弄反了不然思路会有点乱,尤其是< path >规则。
注意事项有:规则的字符串分组必须与url的一样,即在< path >规则中 url后所有字符串为一个整体。还有前导零的去除
源代码
1 |
|
测试用例
1 | 5 10 |
过程太艰难了。
他人满分代码
1 |
|
杭电OJ
大数相加
源代码
1 |
|
测试数据
6组测试数据
6
99 1
Case 1:
99 + 1 = 100
888 744
Case 2:
888 + 744 = 1632
987654321987654321 987654321987654321
Case 3:
987654321987654321 + 987654321987654321 = 1975308643975308642
9999999999999999999 9
Case 4:
9999999999999999999 + 9 = 10000000000000000008
44 55
Case 5:
44 + 55 = 99
Case 6:
454546 4545499999999999999999999999999999
454546 + 4545499999999999999999999999999999 = 4545500000000000000000000000454545
递归转迭代(fi)
源代码
1 |
|
字符串统计
1 |
|
1 | /* 2072 */ |
【1003】Max Sum
Problem Description
Given a sequence a[1],a[2],a[3]……a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.
Input
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and 1000).
Output
For each test case, you should output two lines. The first line is “Case #:”, # means the number of the test case. The second line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end position of the sub-sequence. If there are more than one result, output the first one. Output a blank line between two cases.
Sample Input
1 | 2 |
Sample Output
1 | Case 1: |
题意
给定T组序列,找到各个序列中和最大值,以及始点终点
思路
采用动态规划,简化版-》当sum加上a[i]比a[i]小,则结束记录;重新开始下一段和的计算。同时更新最大值以及始点终点。
源代码
1 |
|
【1024】Max Sum Plus Plus
Problem Description
Now I think you have got an AC in Ignatius.L’s “Max Sum” problem. To be a brave ACMer, we always challenge ourselves to more difficult problems. Now you are faced with a more difficult problem.
Given a consecutive number sequence S1, S2, S3, S4 … Sx, … Sn (1 ≤ x ≤ n ≤ 1,000,000, -32768 ≤ Sx ≤ 32767). We define a function sum(i, j) = Si + … + Sj (1 ≤ i ≤ j ≤ n).
Now given an integer m (m > 0), your task is to find m pairs of i and j which make sum(i1, j1) + sum(i2, j2) + sum(i3, j3) + … + sum(im, jm) maximal (ix ≤ iy ≤ jx or ix ≤ jy ≤ jx is not allowed).
But I`m lazy, I don’t want to write a special-judge module, so you don’t have to output m pairs of i and j, just output the maximal summation of sum(ix, jx)(1 ≤ x ≤ m) instead. ^_^
Input
Each test case will begin with two integers m and n, followed by n integers S1, S2, S3 … Sn.
Process to the end of file.
Output
Output the maximal summation described above in one line.
Sample Input
1 | 1 3 1 2 3 |
Sample Output
1 | 6 |
题意
n个序列分m组,求出最大m个字段的序列元素和
思路
源代码
1 |