题目链接:
http://poj.org/problem?id=2437
题目意思:
给n个区间,每次可以用长度为L的棒A去覆盖,求将所有区间覆盖至少需要几次。给的区间不覆盖。
解题思路:
简单贪心。
先将区间按从大到小排序,然后依次放棒A,如果A在该区间有多的,且覆盖到了后面一个区间,则下一个区间可以该棒后面一位置开始覆盖。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#define M 1000000007
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; #define Maxn 110000 struct Inte
{
ll s,e;
}inte[Maxn];
int n,l; bool cmp(struct Inte a,struct Inte b)
{
return a.s<b.s;
} int main()
{
ll la; while(~scanf("%I64d%I64d",&n,&l))
{
for(int i=1;i<=n;i++)
scanf("%I64d%I64d",&inte[i].s,&inte[i].e); sort(inte+1,inte+n+1,cmp); //将区间从小到大排序
la=-1;
ll ans=0,len,num; for(int i=1;i<=n;i++)
{
if(inte[i].e<=la) //如果上一个棒将这个区间完全覆盖了,则不需要继续添加棒了
continue; if(inte[i].s<la) //如果占据了该区间一部分
{
len=inte[i].e-la; //剩下的长度
num=(len+(l-1))/l; //所需要的棒的个数,注意向上取整
ans+=num; //
la+=num*l; //新的棒的覆盖位置
}
else
{
len=inte[i].e-inte[i].s; //上一个棒 没有延伸到该区间
num=(len+(l-1))/l; //棒的个数
ans+=num;
la=inte[i].s+num*l; //新的棒的覆盖位置
}
}
printf("%I64d\n",ans);
}
return 0;
}