计算投影总长度

A    5    10
A    15    18
A    2    7
A    4    6
B    1    10
B    3    5
C    1    3
C    4    5
C    11    13

如上,第一列为标签(列间以tab分隔),其后两列可以看成是x轴上一条线段的两个端点,计算相同标签下线段的投影总长度(即不计算重叠的部分)。

以标签A为例:
下载 (2.18 KB)
2011-06-09 20:31


最终A标签下线段投影总长度为10-2+18-15=11。

请大侠们指点一下怎么编程序解决吧。

谢谢啦^_^

作者: junlingpang   发布时间: 2011-06-09

分情况一个个算?

作者: yybmsrs   发布时间: 2011-06-09

回复 yybmsrs


    嗯,得考虑到每一种情况,思路有点儿乱,谢谢参与

作者: junlingpang   发布时间: 2011-06-09

没严格测试,你看看是否正确。
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my %result;
  5. while (<DATA>) {
  6.         my ($key,$start,$end) = split /\s+/;
  7.          foreach ($start+1 .. $end) {
  8.                  $result{$key}{'count'}++ unless ($result{$key}{$_});
  9.                  $result{$key}{$_} = 1;
  10.          }
  11. }
  12. foreach (keys %result) {
  13.         print "$_\t$result{$_}{'count'}\n";
  14. }

  15. <STDIN>;

  16. __DATA__
  17. A    5    10
  18. A    15    18
  19. A    2    7
  20. A    4    6
  21. B    1    10
  22. B    3    5
  23. C    1    3
  24. C    4    5
  25. C    11    13
复制代码

作者: iamlimeng   发布时间: 2011-06-09

A 并 B = A + B - (A 交 B) 这个公式叫什么来着?可以用

作者: zhlong8   发布时间: 2011-06-09

回复 iamlimeng


    刚试了下,可以的,谢谢了
    我再好好研究研究,呵呵

作者: junlingpang   发布时间: 2011-06-09

回复 zhlong8


    嗯。对于两个的情况还行,多个并集可能实现起来有点儿麻烦。谢谢提供思路

作者: junlingpang   发布时间: 2011-06-09



QUOTE:
回复  zhlong8


    嗯。对于两个的情况还行,多个并集可能实现起来有点儿麻烦。谢谢提供思路
junlingpang 发表于 2011-06-09 22:34




    对计算机来说多个和两个没有质的区别,它就是做重复运算的。而且写出来的程序具有通用性,抽象级别很高

作者: zhlong8   发布时间: 2011-06-09

回复 zhlong8


    嗯,我试一下,谢谢大侠

作者: junlingpang   发布时间: 2011-06-09

回复 junlingpang


    这是最简单的递归思路,其实数端点的方法更快

作者: zhlong8   发布时间: 2011-06-09