→题目链接←
我觉得这个题主要就是要处理好每个山的边界问题
对于横跨0°的要特殊处理
我是把它拆成两段,最后一定是每个山的端点都是秒数从小到大的
然后以左端点从小到大排序,再乱搞一搞统计答案就好了,具体看代码吧
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define inf 180*60*60
using namespace std;
struct node{
int l,r;
friend bool operator < (node a,node b){
return a.l<b.l;
}
};
int n;
node a[1010];
int main(){
scanf("%d",&n);
int num=n;
for(int i=0; i<n; i++){
int x,y,z;
int num1,num2;
scanf("%d%d%d",&x,&y,&z);
num1=(x*60+y)*60+z;
scanf("%d%d%d",&x,&y,&z);
num2=(x*60+y)*60+z;
if(num1>num2)swap(num1,num2);
if(num2-num1>inf){
a[num].l=0;
a[num].r=num1;
num++;
a[i].l=num2;
a[i].r=inf*2;
}
else a[i].l=num1,a[i].r=num2;
}
sort(a,a+num);
int ans=0,Maxr=0;
for(int i=0; i<num; i++){
if(a[i].r>Maxr)ans+=min(a[i].r-Maxr,a[i].r-a[i].l);
Maxr=max(Maxr,a[i].r);
}
printf("%d\n",ans);
return 0;
}