题目链接
http://www.usaco.org/index.phppage=viewproblem2&cpid=786
思路
先按照开始时间从小到大排序,把总覆盖时间求出来
在用第二个for循环把最小单独覆盖的求出来
#include<bits/stdc++.h>
//#define long long int
using namespace std;
const int N = 1e5+5;
struct node{
int l,r;
}line[N];
int n;
bool cmp(node a, node b){
if (a.l != b.l) return a.l < b.l;
return a.r < b.r;
}
int main(){
freopen ("lifeguards.in","r",stdin);
freopen ("lifeguards.out","w",stdout);
cin >> n;
for (int i = 1; i <= n; i++){
cin >> line[i].l >> line[i].r;
}
sort(line+1,line+1+n,cmp);
int last = line[1].l, ans = 0;
for (int i = 1; i <= n; i++){
//这个for求出总覆盖时间
if (line[i].r > last){
if (last > line[i].l){
ans += line[i].r-last;
last = line[i].r;
}else{
ans += line[i].r-line[i].l;
last = line[i].r;
}
}
}
last = line[1].l;
line[n+1].l = line[n].r; //设定边界
int m;
for (int i = 1; i <= n; i++){
//找出自己一个人工作时间最小的人
if (line[i].r < last){
m = 0;
}else{
int p = max(0,min(line[i].r,line[i+1].l) - max(line[i].l, last));
last = max(last, line[i].r);
m = min(m,p);
}
}
cout << ans-m;
}
反思
碰到这类问题画图来想会比较清楚