信息学奥赛一本通(1323:【例6.5】活动选择)
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通(1323:【例6.5】活动选择)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1323:【例6.5】活動選擇
時間限制: 1000 ms ??? ??? 內存限制: 65536 KB
提交數: 10673 ??? 通過數: 5828
【題目描述】
學校在最近幾天有n個活動,這些活動都需要使用學校的大禮堂,在同一時間,禮堂只能被一個活動使用。由于有些活動時間上有沖突,學校辦公室人員只好讓一些活動放棄使用禮堂而使用其他教室。
現在給出n個活動使用禮堂的起始時間 begini 和結束時間 endi(begini
【輸入】
第一行一個整數n(n≤1000);
接下來的n行,每行兩個整數,第一個begini,第二個是endi(begini
【輸出】
輸出最多能安排的活動個數。
【輸入樣例】
11 3 5 1 4 12 14 8 12 0 6 8 11 6 10 5 7 3 8 5 9 2 13【輸出樣例】
4【分析】
? ? ? ? 算法模型∶給 n 個開區(qū)間(begini,endi),選擇盡量多的區(qū)間,使得兩兩不交。
? ? ? ? 做法:首先按照 endl<=end2<=…<=endn 的順序排序,依次考慮各個活動,如果沒有和已經選擇的活動沖突,就選;否則就不選。
? ? ? ? 正確性:如果不選 endl,假設第一個選擇的是endi,則如果 endi 和 end1 不交叉則多選一個 end1 更劃算;如果交叉則把 endi 換成 end1 不影響后續(xù)選擇。
【參考代碼】
#include <stdio.h> #define N 1010 struct schedule {int begin; //開始時間 int end; //結束時間 }meet[N],t;int main() {int i,j,n,ans=1,record;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d%d",&meet[i].begin,&meet[i].end);for(i=0;i<n-1;i++) //比較排序 { for(j=i+1;j<n;j++){ if(meet[i].end > meet[j].end){t=meet[i];meet[i]=meet[j];meet[j]=t;}}}record=meet[0].end; //第一個結束時間 for(i=1;i<n;i++){if(meet[i].begin >= record) //開始時間不沖突 {ans++;record=meet[i].end; //更新結束時間}}printf("%d\n",ans);return 0; }http://ybt.ssoier.cn:8088/problem_show.php?pid=1323
總結
以上是生活随笔為你收集整理的信息学奥赛一本通(1323:【例6.5】活动选择)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通 1085:球弹跳高度的
- 下一篇: 信息学奥赛一本通(1247:河中跳房子)