90 likes | 211 Views
解题 报告. —— an_easy_problem4. 福州大学13级计算机四班 李毅 学号:031302421. 问题描述. 给你n个数,每个数不超过100。 给你两个数a,b。让你求第a个数到第b个数的和。 这样的运算进行m次。 n、m不超过100000。. 问题分析. 给你n个数,每个数不超过100,n不超过100000。 考虑到100*100000仍在int范围内,所以这一题用int就可以解决问题了,可以不用_int64。 求和进行m次,有n个数,n,m最大为100000 100000*100000=10^10>10^8
E N D
解题报告 ——an_easy_problem4 福州大学13级计算机四班 李毅 学号:031302421
问题描述 • 给你n个数,每个数不超过100。 • 给你两个数a,b。让你求第a个数到第b个数的和。 • 这样的运算进行m次。 • n、m不超过100000。
问题分析 • 给你n个数,每个数不超过100,n不超过100000。 • 考虑到100*100000仍在int范围内,所以这一题用int就可以解决问题了,可以不用_int64。 • 求和进行m次,有n个数,n,m最大为100000 • 100000*100000=10^10>10^8 • 这题如果算法复杂度为O(m*n)的话那会超时,所以算法复杂度应该控制在O(m*logn)、O(n*logm)、O(m+n)。 • 所开辟的空间大小小于32M,这方面不用担心
问题分析 • 方法一:对于求和我们可以一个一个数相加,求和 • 分析:如果采用简单累加的方式,算法复杂度为O(m*n),这种做法会导致超时。 • 3 4 5 6 7 • 方法二:保存前n项的和,然后对应项相减即可获得结果。 • 分析:采用这种方法,复杂度为O(m),可行。 • 1 2
问题分析 • 方法三:利用树状数组求解,分别求前b个的和与前a-1个的和,然后相减就可以得到区间的和。 • x&(-x); • 求和 • sum+=c[n]; • n=n-lowbit(n); • 修改 • c[i]=c[i]+x; • i=i+lowbit(i); • 分析:采用这种方法算法复杂度为O(m*logn),不会超时。但会比方法二O(m)慢一点
问题分析 • 方法四:利用线段树进行求和 • http://blog.csdn.net/xiaotaoqibao/article/details/5756297 • 分析:采用这种方法算法复杂度为O(m*logn),不会超时。但会比方法二O(m)慢一点,与方法三相同,但是写起来非常麻烦。而且占用空间较多。
问题分析 • 方法选择: • 对于这一道题目来说,前三种方法的空间占用大小都差不多,而第四种方法所占用的空间可能会更大。 而对于算法的复杂度来说,第二算法的复杂度只有O(m),第一种算法会超时,第三、第四种算法稍不如第二种算法。 而从算法的难易程度来说,明显第二组算法最简单也比较好理解。 结合以上几点,所以说第二种算法是本题的最有解法,所以选择第二种。
总结 • 对于这一道题目来说,虽然第二种解法是最优的解法,但是在一些复杂的问题上,这种做法就很有可能超时了,也就是说这一种做法的适用范围比较小,我们以后遇到到很多问题可能并不能用这一种方法解决。更多的时候我们需要运用树状数组或者线段树,这可以使得原来一些不能解决的问题得到解决,在这两者之中,线段树虽然写起来比较复杂,占用的空间会更大一些,但有些时候他能解决一些树状数组解决不了的问题,也就是说它的适用范围更广。 • 对于这道题来说虽然第二解法最优,但是我认为如果能使用树状数组或者线段树的话对于我们来说意义更大。
Thanks For Attention