3323 - 区间交交

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB


<span><span><span><b>念奴娇</b></span></span><span><span><b>·</b></span></span><span><span><b>赤壁怀古</b></span></span></span>

<span><b>大江东去</b></span><span><span><span><b>,</b></span></span></span>

<span><b>浪淘尽,</b></span>

<span><b>千古风流人物。</b></span>

<span><b>故垒西边,</b></span>

<span><b>人道是,</b></span>

<span><b>三国周郎赤壁。</b></span>

<span><b>乱石穿空,</b></span>

<span><b>惊涛拍岸,</b></span>

<span><b>卷起千堆雪。</b></span>

<span><b>江山如画,</b></span>

<span><b>一时多少豪杰。</b></span>

<span><b>遥想公瑾当年,</b></span>

<span><b>小乔初嫁了,</b></span>

<span><b>雄姿英发。</b></span>

<span><b>羽扇纶巾,</b></span>

<span><b>谈笑间,</b></span>

<span><b>樯橹灰飞烟灭。</b></span>

<span><b>故国神游,</b></span>

<span><b>多情应笑我,</b></span>

<span><b>早生华发。</b></span>

<span><b>人生如梦,</b></span>

<span><b>一尊还酹江月。</b></span>

<span></span>刘备今年终于进入浙江传媒学院了,想当年在高中的那场数学之战真是惊心动魄。为了能够顺利借到东风,诸葛亮将两组区间放在一起。将它们共同的部分提取出来,然后向上苍祷告。于是玉皇大帝就命令风神助卧龙一臂之力了。

<span></span>如今,刘备问卧龙,曰:“军师,<span>How long </span>你提取出的区间?”卧龙笑而不语,羽扇一扇便说,他的学生可以告诉刘备!你可以将这两组区间相交的部分在数轴上线段的长度告诉刘备么?

题目输入


数据只有两行代表当年诸葛亮用来提取的两组区间。每行的第一个自然数<span>N (0&lt;=N&lt;100)</span>表示该组区间的数量,接着<span>N</span>对小数<span>si,ei</span>表示区间的开始和结束。

题目输出


输出区间交集的长度输出来,结果保留三位小数。

输入/输出样例

输入格式

2 1 10 14 17
3 3 7 9 15 16 18

输出格式

7.000

C++解答

#include<iostream>
#include<cstdio>
using namespace std;
struct Region {
    double s, e;
}r1[101], r2[101];
double min(double a, double b) { return a < b ? a : b; }
double max(double a, double b) { return a > b ? a : b; }
double cal(Region a, Region b) { // a是靠前的区间
    double dif;
    char first;
    if (a.e < b.e) dif = a.e - max(a.s, b.s), first = 'a';
    else dif = b.e - max(a.s, b.s), first = 'b';
    if (dif > 0) {
        if (first == 'a') a.s = a.e, b.s = b.e;
        else a.s = b.e, b.s = b.e;
        return dif;
    }
    else return 0;
}
int main() {
    int n1, n2;
    while (cin >> n1) {
        for (int i = 0; i < n1; i++) cin >> r1[i].s >> r1[i].e;
        cin >> n2;
        for (int i = 0; i < n2; i++) cin >> r2[i].s >> r2[i].e;
        double ans = 0;
        for (int i = 0; i < n1; i++) for (int j = 0; j < n2; j++) {
            if (r1[i].s < r2[j].s) ans += cal(r1[i], r2[j]);
            else ans += cal(r2[j], r1[i]);
        }
        printf("%.3lf\n", ans);
    }
    return 0;
}