7. 蜜汁序列
成绩 | 10 | 开启时间 | 2016年09月2日 星期五 09:00 |
折扣 | 0.8 | 折扣时间 | 2016年09月7日 星期三 23:40 |
允许迟交 | 否 | 关闭时间 | 2016年10月10日 星期一 23:40 |
题目描述
传说中有一种蜜汁序列特别甜,所以爱吃甜的强渣学长特别喜欢这种序列。。。
蜜汁序列的定义如下:对于一个长度为n的序列a1,...,an,如果这个序列的n个前缀和全部非负,即若a1>=0,a1+a2>=0,...,a1+a2+...+an>=0,则称a序列是蜜汁序列。。。
显然一些蜜汁序列可以分成更多的蜜汁序列,例如1 2这个蜜汁序列可以分成1和2两个蜜汁序列,现在有一个长度为n的蜜汁序列,要求你把他分成若干连续的段,使得每段都是一个蜜汁序列,问最多可以分成多少段?
输入
多组用例,每组用例首先输入一个整数n表示给出的蜜汁序列长度,之后输入n个整数a1,a2,...,an表示该序列的n个元素,以文件尾结束输入
输出
对于每组用例,输出一个整数占一行,表示该序列最多可以分成多少个蜜汁序列
数据范围
用例不超过10组,1<=n<=10^6,-10^4<=ai<=10^4(i=1,2,...,n)
样例输入
1
1
3
1 2 3
样例输出
1
3
解题思路:
这道题的本质就是:输入一串数列,我们要找到这串数列中子串和大于0的数列个数。因为输入的数据有可能为负数,所以这题目的贪心思路表现为:首先,单一的正数是肯定符合蜜汁序列定义的,那么如果全部都是正数,则如给出的示例一样,序列个数即为输入的整数个数。然而题目的陷阱在于负数,即可能出现2,1,-2的情况,这个时候蜜汁序列个数为1,因为要保证所有的子串和为正数。所以,我们可以倒过来看序列,当前扫描到负数时,向前进行遍历,如果此时几个元素和仍未负数,则继续向前扫描,直到和为正停止;如果当前扫描的元素为正,则自动序列计数+1。
虽然我们的运行效率不是最高,但是我们代码短呀哈哈哈~(自我安慰。。。)其实真的很建议每年老师们可以把排行榜前面十名的代码公开,可以让大家互相学习思路,如何提高代码效率精简编程思路~
结果:
在这里再说一句题外话,今年老师和助教们出题非常注意题目类型的分类,这样也有助于大家对某一类算法的题目自身态度由初识、沉稳、熟知、轻松慢慢转换。所以,大家请好好做题吧!