假設乙個試題庫中有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,再把源節點與型別相連,把題目與匯節點相連 這...