题目链接:
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 ",ans); } return 0; }