UVALive6834->贪心
题意:
某人逛商场,在进一家店A之前必须要先去另一家店B,现在给出商场的总长度,以及所有的进店的先后次序,求从商场进去逛完所有必须店铺到出去的最小耗时。
题解:
把每个有访问先后次序的店铺都等价成一个区间,如果区间有相交,采取贪心策略,可以先访问完所有优先级高的店铺再回过头来访问优先级较低的店铺,这样可以减小耗时。然后只要区间有连接就把这些区间进行合并,最后求访问完所有被合并过的区间所需要的最小时长。
代码:
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std ;
int N , m ;
struct node
{
int x , y ;
};
node a[505] , after[505] ;
bool comp(const struct node&a , const struct node&b)
{
if(a.x == b.x) return a.y < b.y ;
else return a.x < b.x ;
}
int main()
{
int cnt ;
while(scanf("%d%d" , &N , &m)!=EOF)
{
for(int i = 0 ; i < m ; i ++)
scanf("%d%d" , &a[i].x , &a[i].y) ;
sort(a , a + m , comp) ;
node temp;
temp.x = a[0].x ;
temp.y = a[0].y;
cnt = 0 ;
for(int i = 1 ; i < m ; i ++)
{
if(a[i].x <= temp.y)
{
if(a[i].y > temp.y)
temp.y = a[i].y ;
}
else
{
after[cnt++] = temp ;
temp.x = a[i].x ;
temp.y = a[i].y ;
}
if(i == m-1) after[cnt ++] = temp ;
}
long long sum = 0 ;
int x = 0 ;
for(int i = 0 ; i < cnt ; i ++)
{
sum += (after[i].y - x) ;
x = after[i].x ;
sum +=(after[i].y - x) ;
}
sum += (N + 1 - x) ;
printf("%lld\n" , sum) ;
}
return 0 ;
}