题目链接:http://poj.org/problem?id=2437
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
struct Node
{
int st,en;
} Node[10005];
bool cmp(struct Node x,struct Node y)
{
return x.st<y.st;
}
int main()
{
int n,l;
while(~scanf("%d%d",&n,&l))
{
memset(Node,0,sizeof(Node));
for(int i=0; i<n; i++)
scanf("%d%d",&Node[i].st,&Node[i].en);
sort(Node,Node+n,cmp);//按照区间左端点从小到大排序
int ans=0,pos=-INF,num;
for(int i=0; i<n; i++)
{
if(pos>=Node[i].en)//如果现在标记的木棒覆盖点已经可以覆盖现在这个区间,则不需要再添加木棒。
continue;
if(pos>Node[i].st)//如果只覆盖了一部分
{
num=ceil((Node[i].en-pos)*1.0/l);//记得向上取整,而且注意向上取整的函数ceil运用于浮点型,要强制转换成浮点型才对。
pos+=num*l;//能覆盖点更新
ans+=num;//答案更新
}
else
{
num=ceil((Node[i].en-Node[i].st)*1.0/l);
pos=Node[i].st+num*l;
ans+=num;
}
}
printf("%d\n",ans);
}
return 0;
}