这道题的重点就在于排序化简,在计算区间的时候除了遍历比较大小的思路其实还有一种脱胎于括号配对思想的方法,就是当左括号全部被配对成功下一个如果有一定使左括号,并且是一个新的不相关的区间。
#include <iostream>
#include <algorithm>#include <cstdio>
using namespace std;
struct Node
{
int right;
int left;
Node()
{
right = 0;
left = 0;
}
Node(int r,int l)
{
right = r;
left = l;
}
};
Node n[20001];
bool Compare(Node n,Node m)
{
return n.left<m.left;
}
int main()
{
int num;
scanf("%d",&num);
int sum(0);
int le(0),ri(0);
for (int i = 0;i < num;i++)
{
scanf("%d %d",&n[i].left,&n[i].right);
}
sort(n,n+num,Compare);
le = n[0].left;
ri = n[0].right;
for(int i = 1;i < num;i++)
{
if(n[i].left>ri)
{
sum+=(ri-le);
le = n[i].left;
ri = n[i].right;
}
else
{
if(n[i].right>ri)
{
ri = n[i].right;
}
}
}
sum+=(ri-le);
cout << sum;
return 0;
}