我過(guò)的是比較幸運(yùn)的。首先我用一個(gè)二維數(shù)組f[][]存下某些狀態(tài),其中f[i][j]表示長(zhǎng)度為i,1的個(gè)數(shù)不超過(guò)j的數(shù)目。然后如果某個(gè)數(shù)小于2^L,那么肯定輸出原數(shù),如果不是再特殊處理,找到第一個(gè)f[i][L]比I大的i。然后比較I和f[i][L],f[i-1][L]其中哪個(gè)近,離哪個(gè)近就從那邊開(kāi)始搜。一直搜到結(jié)果為止,這樣能過(guò),但是險(xiǎn)過(guò)。有一組數(shù)據(jù)用時(shí)0.9+S。其中還有一些要注意的就是用long long。也就是如果測(cè)試數(shù)據(jù)有31 31的話,不用long long 會(huì)超數(shù)據(jù)范圍。(我大致算了下,我這種寫(xiě)法,極限數(shù)據(jù)應(yīng)該會(huì)超過(guò)1S,那樣的話必掛無(wú)疑。但是好像usaco的數(shù)據(jù)沒(méi)這種)
官方的:首先也是處理一個(gè)和我的一樣的二維數(shù)組。不過(guò)后面明顯比我的要好,標(biāo)稱是用遞歸寫(xiě)的,直接輸出。
void printbits(int nbits, int nones, double index)
{/*nbits 表示剩下的要處理的長(zhǎng)度 nones 表示剩下的1的個(gè)數(shù) index表示第多少個(gè)*/
double s;
if(nbits == 0)/*處理完成*/
return;
s = sizeofset[nbits-1][nones];/*得到f[bits-1][nones]*/
if(s <= index)
{/*如果index大于這個(gè)f值*/
fprintf(fout, "1");/*那么這位肯定是1 */
printbits(nbits-1, nones-1, index-s);/*改變相應(yīng)的狀態(tài) 繼續(xù)輸出 長(zhǎng)度-1,1的個(gè)數(shù)-1 index-s 這里這個(gè)index-s有點(diǎn)像10進(jìn)制化2進(jìn)制*/
}
else
{
fprintf(fout, "0"); /*小于這個(gè)f值這位肯定為0*/
printbits(nbits-1, nones, index);/*改變相應(yīng)的狀態(tài)繼續(xù)輸出 長(zhǎng)度-1 1的個(gè)數(shù)不減 index也不變*/
}
}