試題庫問題

2021-07-28 19:15:05 字數 1787 閱讀 5497

假設乙個試題庫中有n道試題。 每道試題都標明了所屬類別。同一道題可能有多個類別屬性。現要從題庫中抽取 m 道題組成試卷。並要求試卷包含

指定型別的試題。試設計乙個滿足要求的組卷演算法。

對於給定的組卷要求,計算滿足要求的組卷方案。
由檔案input.txt提供輸入資料。 檔案第1行有2個正整數n和k (2 <=k<= 20, k<=n<= 1000)k 表示題庫中試題型別總數,n 表示題庫中試題總數。

第 2 行有 k 個正整數,第 i 個正整數表示要選出的型別i的題數。這k個數相加就是要選出的總題數m。接下來的n行給出了題庫中每個試題的型別信

息。每行的第1 個正整數p表明該題可以屬於 p類,接著的 p個數是該題所屬的型別號。

程式執行結束時,將組卷方案輸出到檔案 output.txt 中。檔案第 i 行輸出 「i:」後接型別i的題號。如果有多個滿足要求的方案,只要輸出1

個方案。如果問題無解,則輸出「no solution!」。

input.txt 

3 15

3 3 4

2 1 2

1 3

1 3

1 3

1 3

3 1 2 3

2 2 3

2 1 3

1 2

1 2

2 1 2

2 1 3

2 1 2

1 1

3 1 2 3

output.txt

1: 1 6 8

2: 7 9 10

3: 2 3 4 5

這題和圓桌問題一樣水。

使用二分圖的策略,在對應的要求和試題之間連容量為1的邊,分別向源點和匯點連邊,dinic一遍,不需要返回值,從源點開始判斷所有出邊,若有容量未滿的邊就輸出」no solution!」,否則像圓桌問題一樣將所得答案排序後輸出。

我的程式在cogs上能過,但是在洛谷上只有90分,好迷啊

code:

#include

#include

#include

#include

using

namespace

std;

const

int inf=1e9;

struct edge

a[20000];

int head[3001];

int deep[3001];

int ans[1001];

int n,k,x,y,num=1,s,t,tot;

queue

q;inline

int min(int a,int b)

inline

bool bfs()

return deep[t]int dfs(int now,int limit)

deep[now]=-1;return flow;

}inline

void dinic()

int main()

for(int i=1;i<=n;i++)

add(k+i,t,1);

dinic();

for(int i=head[s];i;i=a[i].next)

if(a[i].remain)

for(int i=1;i<=k;i++)

return

0;}

試題庫問題

網路流24題裡面的,這題應該不算難,建圖比較簡單,就是把源點和型別連一條流量為需求題的邊,把型別和對應的題連一條流量為1的邊,把題和匯點連一條流量為1 的邊,保證每道題只用一次。然後找型別和題之間滿流的邊,表示這題在裡面。include include include include using n...

試題庫問題

題目描述 假設乙個試題庫中有n道試題。每道試題都標明了所屬類別。同一道題可能有多個類別屬性。現要從題庫中抽取m 道題組成試卷。並要求試卷包含指定型別的試題。試設計乙個滿足要求的組卷演算法。對於給定的組卷要求,計算滿足要求的組卷方案。輸入格式 第1行有2個正整數k和n 2 k 20,k n 1000 ...

試題庫問題

匈牙利演算法 這是題目 因為是網路流24題網路流十分擅長這種求關係的題目,所以我們優先考慮寫網路流。對於網路流一類的問題,我們優先開啟畫圖軟體思考如何建模。首先我們先把這些題目與型別之間建一條邊 接著再把這些無向邊變成有向邊,然後再加上源節點s與匯節點t,再把源節點與型別相連,把題目與匯節點相連 這...