51Nod 活动安排问题(贪心)
2017-02-21 16:22
288 查看
有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动?
输入
输出
输入示例
:
输入
第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 - N + 1行:每行2个数,线段的起点和终点(-10^9 <= S,E <= 10^9)
输出
输出最多可以选择的线段数量。
输入示例
3 1 5 2 3 3 6
题解:由分析知道时间越早结束(end越小),举办的活动越多,但同时要考虑下一个活动的开始时间一定 要大等于上一个活动的结束时间
#include<stdio.h> int main() { int n; int count=0; int t=-1e9-100; int s[100001]={0},e[100001]={0}; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&s[i],&e[i]); } for(int i=0;i<n;i++) { int ts,te; for(int j=i;j<n;j++)//先把end从小到大排序,对应的start也交换位置与之对应 { if(e[i]>e[j]) { te=e[i]; e[i]=e[j]; e[j]=te; ts=s[i]; s[i]=s[j]; s[j]=ts; } } if(t<=s[i])//下一个start一定大等于上一个end的时间 { t=e[i]; count+=1; } } printf("%d\n",count); return 0; }
另解
:
#include<stdio.h> #include<algorithm> using namespace std; struct node { int s; int e; } a[10001]; bool cmp(node x,node y) { return x.e<y.e; } int main() { int n; int count=0; int t=-1e9-100; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&a[i].s,&a[i].e); } sort(a,a+n,cmp); for(int i=0;i<n;i++) { if(t<=a[i].s) { t=a[i].e; count+=1; } } printf("%d\n",count); return 0; }
相关文章推荐
- 【51Nod】1428 - 活动安排问题(贪心 || 思维)
- 51NOD - 贪心算法入门 - 活动安排问题 【简单贪心】
- 51Nod 1428 活动安排问题(会场安排问题/贪心)
- 贪心+优先队列-51nod-1428 活动安排问题
- 51nod 1428 活动安排问题 优先队列+贪心
- 51nod 活动安排问题之二 (贪心+stl)
- 51Nod 1428 活动安排问题 贪心+优先队列
- 51Nod 活动安排问题之二(贪心)
- 51nod 1428 活动安排问题 贪心
- 51NOD - 贪心算法入门 - 活动安排问题 之 二【简单贪心 + 思维】
- 51nod 活动安排问题 (贪心)
- 51nod贪心例子活动安排问题二
- 51nod 1428 活动安排问题 (贪心+优先队列)
- 51nod 1428 活动安排问题(贪心)
- 51Nod 1428 活动安排问题 (贪心
- 51nod 贪心入门之二 活动安排问题
- 【贪心+优先队列】1428 活动安排问题【51nod】【难度:2级算法题】
- 51nod 1428 活动安排问题(贪心)
- 51nod 1428 活动安排问题 (贪心+优先队列)
- 贪心算法-活动安排问题