NYOJ 14 会场安排问题 贪心算法 之 选择不相交区间
生活随笔
收集整理的這篇文章主要介紹了
NYOJ 14 会场安排问题 贪心算法 之 选择不相交区间
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
會場安排問題
時間限制:3000?ms ?|? 內存限制:65535?KB 難度:4 描述輸入
每組測試數據的第一行是一個整數n(1<n<10000)表示該測試數據共有n個活動。
隨后的n行,每行有兩個正整數Bi,Ei(0<=Bi,Ei<10000),分別表示第i個活動的起始與結束時間(Bi<=Ei)
每組的輸出占一行
解題思路:這是一個貪心法中選擇不相交區間的問題。先對活動結束時間從小到大排序,排序的同時活動的起始時間也要跟著變化。而且,結束時間最小的活動一定會安排,不然這段時間就白白浪費了。后一個活動的起始時間如果比前一個活動的結束時間大,即兩個活動沒有相交時間,就把這個活動也安排上。就這樣一直找到結束時間最大的,輸出時間數目即可。排序時可用下面的方法,排序的同時起始時間也跟著變了。
int cmp(struct nn a1,struct nn a2)
{
if(a1.c!=a2.c)
return a1.c<a2.c;
? ? if(a1.b!=a2.b)
return a1.b<a2.b;
}
如果輸入
0 6
3 4
1 9
2 8
則排序后的結果就是
3 4
0 6
2 8
1 9
AC代碼:
#include<stdio.h> #include<algorithm> using namespace std; struct nn {int b,c; }a[10005]; /*定義結構體數組*/ int cmp(struct nn a1,struct nn a2) { if(a1.c!=a2.c) return a1.c<a2.c;if(a1.b!=a2.b) return a1.b<a2.b; } /*排序*/ int main() { int n,i,p,m; scanf("%d",&m); while(m--) {scanf("%d",&n);for(i=0;i<n;i++) scanf("%d %d",&a[i].b,&a[i].c);sort(a,a+n,cmp); /*調用排序函數*/p=a[0].c;int count=1;for(i=1;i<n;i++)if(a[i].b>p){count++;p=a[i].c;} /*后一個活動起始時間比前一個結束時間大,不相交,count加1*/printf("%d\n",count); } return 0; }
?
?
?
總結
以上是生活随笔為你收集整理的NYOJ 14 会场安排问题 贪心算法 之 选择不相交区间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大白话带你梳理一下Dubbo的那些事儿
- 下一篇: hdu 2544 最短路 Dij