1. 程式人生 > 其它 >活動選擇--貪心演算法sdut

活動選擇--貪心演算法sdut

技術標籤:演算法設計c語言資料結構程式設計演算法

活動選擇

Description
學校的大學生藝術中心週日將面向全校各個學院的學生社團開放,但活動中心同時只能供一個社團活動使用,並且每一個社團活動開始後都不能中斷。現在各個社團都提交了他們使用該中心的活動計劃(即活動的開始時刻和截止時刻)。請設計一個演算法來找到一個最佳的分配序列,以能夠在大學生藝術中心安排不衝突的儘可能多的社團活動。
比如有5個活動,開始與截止時刻分別為:
在這裡插入圖片描述
最佳安排序列為:1,4,5。
Input
第一行輸入活動數目n(0<n<100);
以後輸入n行,分別輸入序號為1到n的活動使用中心的開始時刻a與截止時刻b(a,b為整數且0<=a,b<24,a,b輸入以空格分隔)。

Output
輸出最佳安排序列所包含的各個活動(按照活動被安排的次序,兩個活動之間用逗號分隔),如果有多個活動安排序列符合要求輸出字典序最小的序列。

Sample
Input

6
8 10
9 16
11 16
14 15
10 14
7 11
Output
1,5,4

程式碼實現及思想大概.(本人學的也不是很好,也處於一邊學習的路上,如有不合適或者理解錯誤的地方,還請斧正)

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int start,endd,id;
}a[111],t;
//定義結構體,存開始,結束時間,以及他們所對應的id
int main() { int n; cin>>n; for (int i=0;i<n;i++) { cin>>a[i].start>>a[i].endd; a[i].id=i+1; //把活動對應的id記錄下來,因為我們是從0開始的,所以這裡要加1; } //以下是氣泡排序,也可以使用快排函式,參照我的部落格上的裝船問題裡sort函式的使用 for (int i=0;i<n-1;i++) { for (int j=0;i<n-
1-i;j++) { if (a[j].endd>a[j+1].endd) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } int s=0,f=1; for (int i=0;i<n;i++) { if (a[i].start-s>=0) // 如果某一個活動的開始時間比某個活動的結束時間晚,就用s記錄這個活動的結束時間,一直按照這個套路迴圈就可以了, { s=a[i].endd; if (f==1) { //如果滿足條件的第一次迴圈就是我們要求的第一個活動,先把它的id給輸出,然後讓我的標記f置零,這個if只執行第一次 cout<<a[i].id; f=0; } else //除了第一次的之外再把其它的符合要求的id給輸出, //這裡多此一舉的原因是因為它輸出的時候有格式要求,如果是個空格的話就不用這麼麻煩了。 { cout<<","<<a[i].id; } } } return 0; }