整数区间(贪心)
2017-07-13 21:05
330 查看
请编程完成以下任务:
1.从文件中读取闭区间的个数及它们的描述;
2.找到一个含元素个数最少的集合,使得对于每一个区间,都至少有一个整数属于该集合,输出该集合的元素个数。
【输入】
首行包括区间的数目n,1<=n<=10000,接下来的n行,每行包括两个整数a,b,被一空格隔开,0<=a<=b<=10000,它们是某一个区间的开始值和结束值。
【输出】
第一行集合元素的个数,对于每一个区间都至少有一个整数属于该区间,且集合所包含元素数目最少。
【样例输入】
4
3 6
2 4
0 2
4 7
【样例输出】
2
【算法分析】
•算法模型:给n个闭区间[ai,bi], 在数轴上选尽量少的点,使每个区间内至少有一个点。
•算法:首先按b1<=b2<=...<=bn排序。每次标记当前区间的右端点x,并右移当前区间指针,直到当前区间不包含x,再重复上述操作。
•如下图,如果选灰色点,移动到黑色点更优。
通俗的想,把区间想成一块块木板,把要找的点想成钉子,如果你的钉子很靠前的话,后面的木板就可能钉不到,每次把钉子钉在你要钉的木板最后,
这样它就能顺便钉更多木板啦
下面代码的看点有 多关键字快排
代码如下
1.从文件中读取闭区间的个数及它们的描述;
2.找到一个含元素个数最少的集合,使得对于每一个区间,都至少有一个整数属于该集合,输出该集合的元素个数。
【输入】
首行包括区间的数目n,1<=n<=10000,接下来的n行,每行包括两个整数a,b,被一空格隔开,0<=a<=b<=10000,它们是某一个区间的开始值和结束值。
【输出】
第一行集合元素的个数,对于每一个区间都至少有一个整数属于该区间,且集合所包含元素数目最少。
【样例输入】
4
3 6
2 4
0 2
4 7
【样例输出】
2
【算法分析】
•算法模型:给n个闭区间[ai,bi], 在数轴上选尽量少的点,使每个区间内至少有一个点。
•算法:首先按b1<=b2<=...<=bn排序。每次标记当前区间的右端点x,并右移当前区间指针,直到当前区间不包含x,再重复上述操作。
•如下图,如果选灰色点,移动到黑色点更优。
通俗的想,把区间想成一块块木板,把要找的点想成钉子,如果你的钉子很靠前的话,后面的木板就可能钉不到,每次把钉子钉在你要钉的木板最后,
这样它就能顺便钉更多木板啦
下面代码的看点有 多关键字快排
代码如下
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[10002],b[10002],n; void qsort(int l,int r) { int i,j,m1,m2,p; i=l;j=r; m1=a[(l+r)/2];m2=b[(l+r)/2]; while(i<=j) { while(b[i]<m2||b[i]==m2&&a[i]<m1) ++i; while(b[j]>m2||b[j]==m2&&a[j]>m1) --j; if(i<=j) { p=a[i];a[i]=a[j];a[j]=p; p=b[i];b[i]=b[j];b[j]=p; ++i;--j; } } if(i<r) qsort(i,r); if(l<j) qsort(l,j); } int main() { //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d%d",&a[i],&b[i]); qsort(1,n); int x=-1,sum=0; for(int i=1;i<=n;++i) { if(x>=a[i]) continue; ++sum; x=b[i]; } printf("%d",sum); //fclose(stdin);fclose(stdout); }
相关文章推荐
- [贪心] 整数区间 HUSTOJ2874
- 贪心,整数区间
- 整数区间(贪心)
- 贪心——整数区间
- 贪心6--整数区间
- poj 1716 贪心(整数区间:2-覆盖)
- 百练+贪心区间选点+最少点覆盖尽量多的区间
- NYOJ 891,287,12 , 14 ,966贪心 区间问题
- 区间相关贪心问题
- 贪心法——区间的最大覆盖数
- POJ 1456 Supermarket 区间问题并查集||贪心
- 10382 - Watering Grass(贪心 区间覆盖问题)洒水面覆盖
- 贪心之区间贪心
- 51nod 1672 区间交 (经典贪心)
- 【BZOJ 4571】美味 【区间异或最大值】【主席树】【贪心】
- Moving Tables(杭电1050)(贪心---区间不重叠问题)
- 贪心算法——n个数连接得到最小或最大的多位整数
- 贪心-区间调度问题
- 贪心问题:区间覆盖 NYOJ 喷水装置(二)
- 区间调度问题(贪心)