小a有n個球,編號分別為1到n,小a每次都會從n個球中取出若干個球,至少取乙個,至多取n個,每次取完再放回去,需要滿足以下兩個條件。
(1)每次取出的球的個數兩兩不同。
(2)每次取出的球的集合兩兩不包含。
包含是指,對於兩次取球,對於取的數目少的那次取球的所有球都出現在取的數目多的那次取球中,例如{1,2}和{1,2,4},{1,2}和{2,3}則不算作包含。
而小a現在突然想知道他最多能進行多少次這樣的操作,並希望你能給出具體的取球方案。
乙個整數n。
第一行乙個數k,表示能進行的最多次數。
接下來k行,每行第乙個整數p,表示這次取的球數,接下來p個數表示這次取的球的編號,編號只需要不同,不需要按照順序輸出,本題設有spj。
對於每個測試點,每組資料第一行正確可以獲得20%的分,如果第一行和方案均正確獲得100%的分。42
1 12 2 3
對於30%的資料,n<=7。
對於50%的資料,n<=20。
對於70%的資料,n<=100。
對於100%的資料,4<=n<=1000。
首先對於30%甚至50%的資料,打表是完全沒問題的,那麼對於可打表的資料,我們可以發現乙個規律:最多可以取的次數為n-2,並且恆成立,下面給出證明:
(1):n為奇數
n最小為5,此時最大次數為3,可為,,,對於7,我們可以在每一組後添1個7,因為原組合不互相包含,那麼加上乙個7後仍不互相包含,然後將6作為單獨一組,以此類推,所有為奇數的n均可以用這種方式構造出。
(2):n為偶數
同(1),n最小為4,最大次數為2,,,對於6可以在每一組後添1個6,因為原組合不互相包含,那麼加上乙個6後仍不互相包含,然後將5作為單獨一組,以此類推,所有為偶數的n均可以用這種方式構造出。證畢。
然後這道題就比較簡單了,**見下:
#includeusing namespace std;
const int maxn=1010;
int n,num;
int f[maxn<<1][maxn];
int main()
} else }
for(int i=num;ireturn 0;
}
NOIP模擬 數球(思維題)
小a有n個球,編號分別為1到n,小a每次都會從n個球中取出若干個球,至少取乙個,至多取n個,每次取完再放回去,需要滿足以下兩個條件。1 每次取出的球的個數兩兩不同。2 每次取出的球的集合兩兩不包含。包含是指,對於兩次取球,對於取的數目少的那次取球的所有球都出現在取的數目多的那次取球中,例如 1,2 ...
NOIp模擬 數列
數列 sequence.pas c cpp 問題描述 雖然msh長大了,但她還是很喜歡找點遊戲自娛自樂。有一天,她在紙上寫了一串數字 1,1,2,5,4。接著她擦掉了乙個1,結果發現剩下1,2,4都在自己所在的位置上,即1在第1位,2在第2位,4在第4位。她希望擦掉某些數後,剩下的數列中在自己位置上...
NOIp模擬 數對
傳送門 很神的dpdp dp題。首先要確定乙個dpdp dp的順序保證答案的正確性。對於兩個元素,分四種情況討論它們的關係 如果a i bjan db i a i leqslant b j and b i a j ai bj and bi 那麼i ii必須排在j jj的前面。如果a i bj and...