有關考試安排的演算法(一) 不衝突的演算法

2021-05-12 11:24:44 字數 1192 閱讀 2645

這是乙個困擾我很久的問題,今天早上洗臉的時候突然想起,事實上也沒有一開始想象中的那麼困難,不管三七二十

一、四七二十八,先記錄下來再說。

要求:1、學校在某個學期一共開放了n門課程由學生自由選擇,每乙個學生可以選擇一門或幾門課程進行學習。

2、在進行期末考試時,同一學生選修的兩門課程不能安排在同乙個時間考。

原本還想要求在最短時間內考完,但只要加上乙個「最」字,實現起來就比較困難了,所以,先簡化一下,只要同一學生選修的兩門課程不能安排在同一時間內考試即可。

學生選課表(selectcourse)的結構如下圖所示:

其中:id:自動增長的主鍵

studentid:學號

studentname:姓名

coursename:選課的課程名

考場安排表(exam)的結構如下圖所示:

其中:id:自動增長的主鍵

examscreenings:考場場次,既第幾場考試

course:考試課程名

examnum:該門課程的選課人數

演算法如下所示:

1、設定考場中最多可同時考試的人數。

2、統計每門課程的考試人數,放入臨時表中。

3、先在臨時表中選出選課人數最多的那門課程,當然,必須要先確定考場中最多可同時考試的人數要大於單門課程的最多選課人數。

4、將考試場次加1,並將選課人數最多的課程(當前課程)新增到考場安排表裡(exam),然後將該門課程從臨時選課表中刪除。

5、然後將考試最多可同時考試的人數減去已經安排的考試課程的人數,得到考場中還可以安排的考試人數,即剩餘考試人數(@remainnum)

6、選擇所有選課人數少於或等於剩餘考試人數的課程,並放到游標裡。

7、迴圈從游標裡取出課程,判斷選擇該課程的學生是否和當前考試場次中已安排的課程的選課學生有衝突(既是否同一學生在同一時間內參加兩門考試)。如果沒有衝突,則將該課程放入考場安排表中,並從臨時表中刪除該門課程。

8、重新統計剩餘考試人數,返回到第5步驟,直到所有選課人數少於剩餘考試人數,或著所有考試都有衝突不能安排為止。

9、返回第3步驟,直到所有課程都已經安排為止。

具體實現的sql語句如下所示:

這個演算法執行速度還可以,我試了13756人次131門選課,執行結果20秒左右。但是,這不是最優的演算法,這131門的選課一共需要106個場次的考試,天哪,太多了!

可以說,這個演算法失敗了!

有人知道更好的演算法嗎?

一些有關PAT乙級考試的內容

1.判斷素數 bool isprime int n 2.解決執行超時問題 1 把cin換為scanf 把cout換為printf 2 在輸入之前加上std ios sync with stdio false 語句 方法 1 和方法 2 不能同時使用。3.大寫字母轉化為小寫字母 string func...

python中演算法 python中的一些演算法

遞迴,尾遞迴 def fact n return fact iter n,1 def fact iter num,product if num 1 return product return fact iter num 1,num product 菲波列切數列 def fibo n if n 1 o...

有關停車遊戲的乙個演算法題

某 有個停車遊戲,有這麼幾台車,奧拓 16000元 臺,停12小時 得7200元 樂騁 45000元 臺,停12小時得 18000元 hammer 800000 臺,停12小時32400元 audi q7 1200000元 臺,停12小時46800元 benz s600 2000000元 臺,停12...